Python: extraire les données d'une chaine de texte structurée en fonction d'une liste d'index

Compatible Python2 & Python3

Exemple avec le contenu de la variable "d" organisée sous la forme d'un tableau

>>> print(d)
2015  0 391371 374179 765550
2014  1 403204 385442 788646
2013  2 405502 386831 792333
2005 10 426532 406488 833020
2004 11 423605 404592 828197
2003 12 421432 402484 823916
1929 86  97489 180249 277738
1928 87  86122 165344 251466
1927 88  72603 149288 221891
1919 96   6011  21172  27183
1918 97   3649  13644  17293
1917 98   2013   9475  11488
1916 99   1324   6313   7637
>>>

Chaque ligne contient exactement le même nombre de données.
Chaque donnée (de longueur fixe) se trouve exactement à la même place sur chaque ligne.
Dans l'exemple, chaque ligne contient donc 5 colonnes.

>>> print(columns)
['Année de naissance', 'Age révolu', "Nombre d'hommes", 'Nombre de femmes', 'Ensemble']
>>>

Les données de la première colonne commencent à l'index 0
Les données de la seconde colonne commencent à l'index 5
Les données de la troisième colonne commencent à l'index 8
Les données de la quatrième colonne commencent à l'index 15
Et enfin, les données de la cinquième colonne commencent à l'index 22

Et c'est pareil pour chaque ligne.

>>> print(i)
[0, 5, 8, 15, 22]
>>>

Une petite boucle va permettre d'extraire toutes les données en fonction de la liste d'index ci-dessus

>>> for line in d.split('\n'):
    x = 0
    for pos in i:
        print("{COLUMN:>20s} : {DATA:<6s}".format(COLUMN=columns[x], DATA=line[pos:i[i.index(pos)+1] if i.index(pos)+1 < len(i) else None].strip()))
        x += 1
    print('*' * 31)

    
  Année de naissance : 2015  
          Age révolu : 0     
     Nombre d'hommes : 391371
    Nombre de femmes : 374179
            Ensemble : 765550
*******************************
  Année de naissance : 2014  
          Age révolu : 1     
     Nombre d'hommes : 403204
    Nombre de femmes : 385442
            Ensemble : 788646
*******************************
  Année de naissance : 2013  
          Age révolu : 2     
     Nombre d'hommes : 405502
    Nombre de femmes : 386831
            Ensemble : 792333
*******************************
  Année de naissance : 2005  
          Age révolu : 10    
     Nombre d'hommes : 426532
    Nombre de femmes : 406488
            Ensemble : 833020
*******************************
  Année de naissance : 2004  
          Age révolu : 11    
     Nombre d'hommes : 423605
    Nombre de femmes : 404592
            Ensemble : 828197
*******************************
  Année de naissance : 2003  
          Age révolu : 12    
     Nombre d'hommes : 421432
    Nombre de femmes : 402484
            Ensemble : 823916
*******************************
  Année de naissance : 1929  
          Age révolu : 86    
     Nombre d'hommes : 97489
    Nombre de femmes : 180249
            Ensemble : 277738
*******************************
  Année de naissance : 1928  
          Age révolu : 87    
     Nombre d'hommes : 86122
    Nombre de femmes : 165344
            Ensemble : 251466
*******************************
  Année de naissance : 1927  
          Age révolu : 88    
     Nombre d'hommes : 72603
    Nombre de femmes : 149288
            Ensemble : 221891
*******************************
  Année de naissance : 1919  
          Age révolu : 96    
     Nombre d'hommes : 6011  
    Nombre de femmes : 21172
            Ensemble : 27183
*******************************
  Année de naissance : 1918  
          Age révolu : 97    
     Nombre d'hommes : 3649  
    Nombre de femmes : 13644
            Ensemble : 17293
*******************************
  Année de naissance : 1917  
          Age révolu : 98    
     Nombre d'hommes : 2013  
    Nombre de femmes : 9475  
            Ensemble : 11488
*******************************
  Année de naissance : 1916  
          Age révolu : 99    
     Nombre d'hommes : 1324  
    Nombre de femmes : 6313  
            Ensemble : 7637  
*******************************
>>>