在Python中读取csv文件并创建字典
我正在尝试读取Python27中的csv文件以创建字典。CSV文件看起来像- SI1440269、SI1320943、SI1321085 SI1440270、SI1320943、SI1321085、SI1320739 SI1440271、SI1320943在Python中读取csv文件并创建字典,python,csv,dictionary,Python,Csv,Dictionary,我正在尝试读取Python27中的csv文件以创建字典。CSV文件看起来像- SI1440269、SI1320943、SI1321085 SI1440270、SI1320943、SI1321085、SI1320739 SI1440271、SI1320943 SI1440273、SI1321058、SI1320943、SI1320943 每行中的条目数不是固定的。第一列条目应该是我的键。我的代码- import csv reader = csv.reader(open('test.csv'))
SI1440273、SI1321058、SI1320943、SI1320943 每行中的条目数不是固定的。第一列条目应该是我的键。我的代码-
import csv
reader = csv.reader(open('test.csv'))
result = {}
for column in reader:
key = column[0]
if key in result:
pass
result[key] = column[1:]
print result
输出:
{'SI1440273':['SI1321058','SI1320943','SI1320943','SI1320943','SI1440271':['SI1320943','','','SI1440270':['SI1320943','SI1321085','SI1320739','SI1440269':['SI1320943','SI1321085','
如何消除输出中的空值?
此外,如何使输出中的键值与csv文件中的键值顺序相同
编辑:
我希望每个“键”有一行您可以使用
csv.DictReader
如下所示:
import csv
result = {}
with open('test.csv') as csvfile:
reader = csv.DictReader(csvfile, delimiter=" ", fieldnames=["id"], restkey="data")
for row in reader:
print row
result[row["id"]] = row["data"]
print result
这将为您提供每行字典解决方案,因此您可以一次处理一行。然后我还将它们全部添加到一个result
dictionary中
由此,您将获得以下输出:
{'data': ['SI1320943', 'SI1321085'], 'id': 'SI1440269'}
{'data': ['SI1320943', 'SI1321085', 'SI1320739', 'SI1440271', 'SI1320943'], 'id': 'SI1440270'}
{'data': ['SI1321058', 'SI1320943', 'SI1320943'], 'id': 'SI1440273'}
{'SI1440273': ['SI1321058', 'SI1320943', 'SI1320943'], 'SI1440270': ['SI1320943', 'SI1321085', 'SI1320739', 'SI1440271', 'SI1320943'], 'SI1440269': ['SI1320943', 'SI1321085']}
试试这个
import csv
reader = csv.reader(open('test.csv'))
result = {row[0]:row[1:] for row in reader if row and row[0]}
print result
如果您想进一步消除值中的null,请按照下面的步骤执行
import csv
reader = csv.reader(open('test.csv'))
result = {row[0]:[i for i in row[1:] if i] for row in reader if row and row[0]}
print result
维持进入秩序
from collections import OrderedDict
result = OrderedDict()
for row in reader:
if row and row[0]:
result[row[0]]=[i for i in row[1:] if i]
# print result
for key in result:
print key,":" ,result[key]
如前所述,这不是CSV-因此readline和split更合适,并使用OrderedDict保持输入顺序:
import csv
from collections import OrderedDict
result = OrderedDict()
with open('test.csv') as f:
for row in f:
row=row.strip().split()
key = row[0]
result[key] = row[1:]
print result
就记录而言,它不是一个真正的csv文件。同样就记录而言,我相信您定义为列的变量实际上是一行:)我不确定是否理解此处的预期输出。你想每个“键”只保留一行吗?我刚刚运行了你的程序,得到了不同的结果:
{'SI1440270 SI1320943 SI1321085 SI1320739 SI1440271 SI1320943':[],'SI1440273 SI1321058 SI1320943 SI1320943':[],'SI1440269 SI1320943 SI1321085':[]
。你能在这里再解释一下你想要什么吗?你的for循环在你的csv文件中的每一行上迭代,而不是每一列。如果将print语句放在循环的顶部,则可以看到这一点:print(column)
。这将打印文件的一行,而不是一列。这部分解决了我的问题。我希望输出中的键值与csv文件中的键值顺序相同。这不会发生在您的代码中。从集合导入OrderedDict并使用iTunesd,但不起作用。代码-import csv from collections import orderedict result=orderedict()reader=csv.reader(open('test.csv'))result={row[0]:[i for i in row[1:]if i]for row in reader if row and row[0]}打印结果
这只是为您的python知识词典准备的,它是一个哈希表,不保留任何顺序,如果您想保留键的输入顺序,则使用orderedict
fromcollections
我添加了第三个示例代码,请使用它。是否必须同时使用“orderedict”一词输出的开始?为什么它不是CSV。需要解释吗?CSV=逗号分隔值-所以字段用逗号分隔,这里我看到它们用空格分隔-所以拆分更容易-CSV阅读器给出的结果如@hobenkr注释中所述