Un hommage aux générateurs:
#!/usr/bin/env python
data=(zip(*([elt.strip().title() for elt in line.replace(':',',',1).split(',')]
for line in open('filename.txt','r'))))
personal_list=[dict(zip(data[0],datum)) for datum in data[1:]]
print(personal_list)
# [{'Food': 'Pizza', 'Car': 'Db9', 'Name': 'John'}, {'Food': 'Lasagne', 'Car': 'M5', 'Name': 'Jane'}]
Pour comprendre comment fonctionne le script, nous le briser:
D'abord, nous charger filename.txt dans une liste de lignes:
In [41]: [line for line in open('filename.txt','r')]
Out[41]: ['name: john, jane\n', 'car: db9, m5\n', 'food: pizza, lasagne\n']
Ensuite, nous remplaçons le premier deux-points (:) avec une virgule (,)
In [42]: [line.replace(':',',',1) for line in open('filename.txt','r')]
Out[42]: ['name, john, jane\n', 'car, db9, m5\n', 'food, pizza, lasagne\n']
Ensuite, nous avons divisé chaque ligne sur des virgules:
In [43]: [line.replace(':',',',1).split(',') for line in open('filename.txt','r')]
Out[43]:
[['name', ' john', ' jane\n'],
['car', ' db9', ' m5\n'],
['food', ' pizza', ' lasagne\n']]
Pour chaque élément dans chaque ligne, nous Désape début/fin des espaces et capitalisons la chaîne comme un titre:
In [45]: [[elt.strip().title() for elt in line.replace(':',',',1).split(',')] for line in open('filename.txt','r')]
Out[45]: [['Name', 'John', 'Jane'], ['Car', 'Db9', 'M5'], ['Food', 'Pizza', 'Lasagne']]
Maintenant, nous recueillons le premier élément de chaque liste, puis la seconde, et ainsi de suite:
In [47]: data=(zip(*([elt.strip().title() for elt in line.replace(':',',',1).split(',')] for line in open('filename.txt','r'))))
In [48]: data
Out[48]: [('Name', 'Car', 'Food'), ('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')]
data [0] occupe maintenant les clés pour un dict.
In [49]: data[0]
Out[49]: ('Name', 'Car', 'Food')
Chaque ligne de données [1:] correspond aux valeurs d'une dict.
In [50]: data[1:]
Out[50]: [('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')]
Ici, nous zip les clés avec les valeurs:
In [52]: [ zip(data[0],datum) for datum in data[1:]]
Out[52]:
[[('Name', 'John'), ('Car', 'Db9'), ('Food', 'Pizza')],
[('Name', 'Jane'), ('Car', 'M5'), ('Food', 'Lasagne')]]
Enfin, nous nous tournons dans une liste de dicts:
In [54]: [dict(zip(data[0],datum)) for datum in data[1:]]
Out[54]:
[{'Car': 'Db9', 'Food': 'Pizza', 'Name': 'John'},
{'Car': 'M5', 'Food': 'Lasagne', 'Name': 'Jane'}]
Je suis un peu confus. Comment incluriez-vous la lecture dans le fichier avec ceci? – Federer
Pour lire un fichier, utilisez 'for line dans f.readlines()'. Je suis content de voir que la version que j'ai écrite est presque identique à celle d'Alex, sauf que la première ligne de ma boucle for est '(k, _, d) = map (str.title, map (str.strip, line.partition (":"))) ' –
Vous n'avez pas besoin d'utiliser' for line dans f.readlines() 'pour lire un fichier; il suffit de dire 'pour line in f'. La méthode '.readlines()' slurp dans toutes les lignes dans le fichier et faire une liste en mémoire; l'objet fichier renvoyé par 'open()' agira comme un itérateur, produisant une ligne à la fois. – steveha