在Python中读取csv文件并创建字典

在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'))

我正在尝试读取Python27中的csv文件以创建字典。CSV文件看起来像-

SI1440269、SI1320943、SI1321085 SI1440270、SI1320943、SI1321085、SI1320739 SI1440271、SI1320943
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
from
collections
我添加了第三个示例代码,请使用它。是否必须同时使用“orderedict”一词输出的开始?为什么它不是CSV。需要解释吗?CSV=逗号分隔值-所以字段用逗号分隔,这里我看到它们用空格分隔-所以拆分更容易-CSV阅读器给出的结果如@hobenkr注释中所述