将字典列表写入CSV文件

41

我在写一个将字典列表写入到 .csv 文件的过程中遇到了困难。

这是我的字典长什么样:

dict[key1]=[1,2,3]
dict[key2]=[4,5,6]
dict[key3]=[7,8,9]

我希望这个 .csv 文件看起来像这样:

key1  key2  key3
1     4     7  
2     5     8
3     6     9

一开始我写下了标题:

outputfile = open (file.csv,'wb')
writefile = csv.writer (outputfile)
writefile.writerow(dict.keys())

到目前为止还不错... 但是,我的问题是我不知道如何将一个列表分配给相应的列。例如:

for i in range(0,len(dict[key1])):
    writefile.writerow([dict[key1][i],dict[key2][i],dict[key3][i])

会随机填充列。另一个问题是我必须手动填写键,并且不能将其用于具有4个键的另一个字典。


“随机填充列”是什么意思? - Rob Watts
2
@RobWatts 我认为OP的意思是由于dict是无序的,所以keys()函数会"随机"打印它们,例如Key 3,Key 1,Key 2。 - Cory Kramer
顺便提一下,你不应该使用 dict 作为变量名。 - Tim Pietzcker
“dict” 不是我的真实变量名...只是一个糟糕的例子。 - suschi
6个回答

46

如果您不关心列的顺序(因为字典是无序的),您可以简单地使用zip()

d = {"key1": [1,2,3], "key2": [4,5,6], "key3": [7,8,9]}
with open("test.csv", "wb") as outfile:
   writer = csv.writer(outfile)
   writer.writerow(d.keys())
   writer.writerows(zip(*d.values()))

结果:

key3    key2    key1
7       4       1
8       5       2
9       6       3

如果您关心顺序,您需要对键进行排序:

keys = sorted(d.keys())
with open("test.csv", "wb") as outfile:
   writer = csv.writer(outfile, delimiter = "\t")
   writer.writerow(keys)
   writer.writerows(zip(*[d[key] for key in keys]))

结果:

key1    key2    key3
1       4       7
2       5       8
3       6       9

我们如何在这里将行转换为列? key1 \tab 7 \tab 4 \tab 1 - Chit Khine
3
如果您看一下问题,我使用zip()函数来转置原始数据。如果再次执行该操作,则会将行转换为列。请注意,key1 - 7 - 4 - 1可能不是您想要的内容... - Tim Pietzcker
1
这对我来说可以运行并得到我想要的输出,但仍会抛出一个类型错误“zip argument #1 must support iteration”。有任何原因吗? - jwoe
1
在Python 2中,您需要使用wb,而在Python 3中,打开CSV文件时需要使用newline=''选项。 - Tim Pietzcker
1
@JasonGoal 如果你还在疑惑答案,这里有一个要点总结,其中这个人解释得非常完美 https://gist.github.com/captmomo/7836eb53b7cee9fb7d38460f70942902 - Yaboku
显示剩余4条评论

4
这将在键中的列表长度不同时仍能正常工作。
    with myFile:  
        writer = csv.DictWriter(myFile, fieldnames=list(clusterWordMap.keys()))   
        writer.writeheader()
        while True:
            data={}
            for key in clusterWordMap:
                try:
                    data[key] = clusterWordMap[key][ind]
                except:
                    pass
            if not data:
                break
            writer.writerow(data)

您可以使用pandas将其保存到csv文件中:
df = pd.DataFrame({key: pd.Series(value) for key, value in dictmap.items()})
df.to_csv(filename, encoding='utf-8', index=False)

1
df = pd.DataFrame(dict) 就足以创建数据框。 - Austin
1
如果字典中存储的值长度不同,它将会失败。 - Kumar Shubham
你能定义一下myFile、clusterWordMap和ind吗?谢谢。 - uoay

2

保存:

with open(path, 'a') as csv_file:
    writer = csv.writer(csv_file)
    for key, value in dict_.items():
        writer.writerow([key, ','.join(value)])
csv_file.close()        
print ('saving is complete') 

read back:

with open(csv_path, 'rb') as csv_file:
    reader = csv.reader(csv_file);
    temp_dict = dict(reader);
mydict={k:v.split(',') for k,v in temp_dict.items()}    
csv_file.close()
return mydict 

2

鉴于

dict = {}
dict['key1']=[1,2,3]
dict['key2']=[4,5,6]
dict['key3']=[7,8,9]

以下代码:
COL_WIDTH = 6
FMT = "%%-%ds" % COL_WIDTH

keys = sorted(dict.keys())

with open('out.csv', 'w') as csv:
    # Write keys    
    csv.write(''.join([FMT % k for k in keys]) + '\n')

    # Assume all values of dict are equal
    for i in range(len(dict[keys[0]])):
        csv.write(''.join([FMT % dict[k][i] for k in keys]) + '\n')

生成一个类似下面这样的csv文件:
key1  key2  key3
1     4     7
2     5     8
3     6     9

2

不使用csv模块自己编写:

d = {'key1' : [1,2,3],
     'key2' : [4,5,6],
     'key3' : [7,8,9]}

column_sequence = sorted(d.keys())
width = 6
fmt = '{{:<{}}}'.format(width)
fmt = fmt*len(column_sequence) + '\n'

output_rows = zip(*[d[key] for key in column_sequence])

with open('out.txt', 'wb') as f:
    f.write(fmt.format(*column_sequence))
    for row in output_rows:
        f.write(fmt.format(*row))

1
key_list = my_dict.keys()    
limit = len(my_dict[key_list[0]])    

for index in range(limit):    
  writefile.writerow([my_dict[x][index] for x in key_list])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接