以下是我的文本文件中的数据集。
2.1,3.5,1.4,0.2,Iris
4.9,3.0,1.4,0.2,Ilia
3.7,3.2,1.3,0.2,Iridium
有一个名为:
的清单list_of_keys
在列表中包含以下值
['S_Length','S_Width','P_Length','P_Width','Predicate']
所以,问题是,我想创建一个字典列表来保存我的所有数据(来自文本文件),使用list_of_keys as keys
字典,如下所示:
dict =
{'S_Length': 2.1, 'S_Width':3.5 , 'P_Length': 1.4, 'P_Width': 0.2, 'Predicate': Iris},
{'S_Length': 4.9, 'S_Width':3.0 , 'P_Length': 1.4, 'P_Width': 0.2, 'Predicate': Ilia},
... so on!
我现在所拥有的:
# store all data from the text files as list
all_examples = file.readlines()
for outer_index in range(len(all_examples)):
for inner_index in range(0, len(list_of_keys)+1):
答案 0 :(得分:4)
您可以使用如下的生成器功能:
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
模块来阅读文本文件:
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')])]
答案 1 :(得分:2)
您只需要使用拆分并进行一些迭代。
尝试:
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
list_of_dict = []
with open('mydata.txt', "r") as f:
for line in f.readlines():
parts = line.strip().split(",")
mydict = {}
i = 0
for k in list_of_keys:
mydict[k] = parts[i]
i += 1
list_of_dict.append(mydict)
print list_of_dict
或者:
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
list_of_dict = []
with open('mydata.txt', "r") as f:
for line in f.readlines():
parts = line.strip().split(",")
mydict = dict(zip(list_of_keys,parts))
list_of_dict.append(mydict)
print list_of_dict
答案 2 :(得分:2)
对于更干净的代码,您可以使用pandas中的函数to_dict
:
import pandas as pd
df = pd.read_csv('example.txt')
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
df.columns = list_of_keys
dict = df.to_dict(orient='records')
print dict[0]
{'P_Width': '0.2', 'S_Length': '4.9', 'Predicate': 'Ilia', 'S_Width': '3.0', 'P_Length': '1.4'}
答案 3 :(得分:0)
如果您认为必须使用,
拆分字符串,则使用namedtuple分别映射每一行。