您可以使用一個發電機之類的函數如下:
def func():
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
with open('example.txt') as f:
for line in f:
yield dict(zip(list_of_keys,line.strip().split(',')))
print(list(func()))
[{'P_Width': '0.2', 'S_Length': '2.1', 'Predicate': 'Iris', 'S_Width': '3.5', 'P_Length': '1.4'}, {'P_Width': '0.2', 'S_Length': '4.9', 'Predicate': 'Ilia', 'S_Width': '3.0', 'P_Length': '1.4'}, {'P_Width': '0.2', 'S_Length': '3.7', 'Predicate': 'Iridium', 'S_Width': '3.2', 'P_Length': '1.3'}]
可以逐行讀取文件中的行,並分割線,然後創建對的鍵和值使用zip
函數,然後將它們轉換爲字典。
請注意,由於文件對象是一個迭代器,因此您可以遍歷文件對象並使用with
語句來打開文件,該文件將關閉塊末尾的文件。
正如你也可以使用csv
模塊讀取文本文件中的另一個替代性和更Python的方式:
import csv
def func():
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
with open('example.txt') as f:
spamreader = csv.reader(f, delimiter=',')
return [dict(zip(list_of_keys,row)) for row in spamreader]
print func()
在這裏,因爲csv.reader
接受一個分隔符參數,返回你的線路全部在一個迭代器,你不分離你需要循環你的文件並手動分割它。
如果你想保留您可以在這兩種情況下使用collections.OrderedDict
順序:
from collections import OrderedDict
import csv
def func():
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
with open('example.txt') as f:
spamreader = csv.reader(f, delimiter=',')
return [OrderedDict(zip(list_of_keys,row)) for row in spamreader]
print func()
[OrderedDict([('S_Length', '2.1'), ('S_Width', '3.5'), ('P_Length', '1.4'), ('P_Width', '0.2'), ('Predicate', 'Iris')]), OrderedDict([('S_Length', '4.9'), ('S_Width', '3.0'), ('P_Length', '1.4'), ('P_Width', '0.2'), ('Predicate', 'Ilia')]), OrderedDict([('S_Length', '3.7'), ('S_Width', '3.2'), ('P_Length', '1.3'), ('P_Width', '0.2'), ('Predicate', 'Iridium')])]
對於使用誰遍歷文件的OP '範圍(len())'這需要稍微多一點解釋。 – bereal
@bereal的確,我剛剛添加。 – Kasramvd