的敬意發電機:
#!/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'}]
要了解劇本是如何工作的,我們打破它拆開:
首先,我們加載到FILENAME.TXT行的列表:
In [41]: [line for line in open('filename.txt','r')]
Out[41]: ['name: john, jane\n', 'car: db9, m5\n', 'food: pizza, lasagne\n']
接下來我們替換第一冒號(:)用逗號(,)
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']
然後我們拆分上逗號的每一行:
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']]
對於每行的每個元素,我們剝離開始/結束空白和利用像標題的字符串:
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']]
現在我們收集每個列表的第一個元素,則第二,等等:
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')]
數據[0]現在適用於一個字典的鍵。
In [49]: data[0]
Out[49]: ('Name', 'Car', 'Food')
data [1:]中的每個元組都是字典的值。
In [50]: data[1:]
Out[50]: [('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')]
在這裏,我們拉上鍵與值:
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')]]
最後,我們把它變成類型的字典列表:
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'}]
我略有困惑。你將如何在這個文件中包含閱讀內容? – Federer 2009-11-05 18:53:20
要從文件中讀取,請使用'for f.readlines()'中的line。我很高興地看到,我寫的版本與Alex的幾乎相同,除了我for循環中的第一行是'(k,_,d)= map(str.title,map(str.strip,line.partition (「:」)))' – 2009-11-05 20:14:55
你不需要在f.readlines()中用'for line來讀取文件;只要說'換行'就足夠了。 '.readlines()'方法將在文件的所有行中徘徊,並在內存中創建一個列表; 'open()'返回的文件對象將作爲一個迭代器,一次產生一行。 – steveha 2009-11-05 20:24:14