Python 字典到 CSV

Posted

技术标签:

【中文标题】Python 字典到 CSV【英文标题】:Python Dictionary to CSV 【发布时间】:2012-01-10 00:21:40 【问题描述】:

我已经编写了将 CSV 读入 python 字典的代码,效果很好。我正在尝试将字典恢复为 CSV。我写了以下内容:

import csv

itemDict=

listReader = csv.reader(open('/Users/broberts/Desktop/Sum_CSP1.csv','rU'), delimiter = ',', quotechar='|')

for row in listReader:
    fID = row[0]
    fClassRange = row[1]
    fArea = row[2]

    if itemDict.has_key(fID):
        itemDict[fID][fClassRange]=fArea
    else:
        itemDict[fID] = '5.0 to 5.25':'','5.25 to 5.5':'','5.5 to 5.75':'','5.75 to 6.0':'','6.0 to 6.25':'','6.25 to 6.5':'','6.5 to 6.75':'','6.75 to 7.0':'','7.0 to 7.25':'','7.25 to 7.5':'','7.5 to 7.75':'','7.75 to 8.0':'','8.0 to 8.25':'',
        itemDict[fID][fClassRange]=fArea

listWriter = csv.writer(open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)

for a in itemDict:
    print a
    listWriter.writerow(a)

在最后一个块中,listWriter 不会向 CSV 写入任何内容,尽管它会打印 a。我相信这与字典无序有关。我真的需要写出 fID 和与每个 fID 关联的每个键(fClassRange 例如“5.0 到 5.25”),然后将与每个 fClassRange 关联的值 fArea 写到 CSV,但我什至还没有得到那么远我的代码,因为我什至无法弄清楚如何写出 fID。

我研究过使用DictWriter,但我不知道如何告诉它所需的fieldnames 是什么。

【问题讨论】:

不得不推荐 Kenneth Reitz 的tablib。它比你在这里寻找的要多,所以这不是一个直接的答案,只是想把这个库推荐给其他人。它有一个很棒的、易于使用的 API,您可以毫不费力地序列化为 csv、tsv、json、yaml 和 xlsx。 【参考方案1】:

默认编写器需要一个列表,这就是它不适合您的原因。要使用 dictwriter,只需将您的 listwriter = 行更改为:

with open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb') as outfile:
    listWriter = csv.DictWriter(
       outfile,
       fieldnames=itemDict[itemDict.keys()[0]].keys(),
       delimiter=',',
       quotechar='|',
       quoting=csv.QUOTE_MINIMAL
    )

或者,如果您知道字段应该是什么,您可以将fieldnames 设置为fieldnames=['arbitrary','list','of','keys']

【讨论】:

哇,谢谢!但现在我收到这条消息:ValueError: dict contains fields not in fieldnames: 4, 6, 3, 3, 9 @bojo 哎呀!你正在制作一个字典。因此,要获得正确的字段名,您需要内部字典 字段名。此外,每个字典必须具有相同的字段名。否则,您需要对不正确的字段名使用 DictWriter 选项。我已更新该行以使用正确的字典来获取字段名。 对不起,Spencer,我仍然收到相同的 ValueError 消息。 @bojo 嗯,在您的 itemDict[fid] = 行上,您将新字典的字段名设置为一些默认值。您可以将列表中的那些用作您的字段吗?不要忘记之后添加的 fClassRange 字段。或者,将您的打印语句更改为 print a.keys() 并使用它。 我真的非常感谢您的帮助。我尝试将“print a”更改为“print a.keys()”只是为了看看发生了什么,我得到了: AttributeError: 'str' object has no attribute 'keys' - 也许这表明有问题?我还尝试使用 DictWriter 语句,其中“fieldnames = myFieldnames”和“myFieldnames”等于您建议的默认类范围列表,但我仍然得到相同的 ValueError。【参考方案2】:

为了后代:

你应该使用 iteritems() 来遍历一个字典,所以最后一部分变成了

for name, values in itemDict.iteritems():
    print values
    listWriter.writerow(values)

【讨论】:

【参考方案3】:

这是我使用的,它很简单,对我来说很好用。 当你只有一本字典时,使用这个

my_dict = "tester": 1, "testers": 2
with open('mycsvfile.csv', 'wb') as f:  
    w = csv.DictWriter(f, my_dict.keys())
    w.writerow(dict((fn,fn) for fn in my_dict.keys()))
    w.writerow(my_dict)

$ cat mycsvfile.csv
testers,tester
2,1

当您有一个字典列表时,例如您从 SQL 查询中获得的内容,您可以这样做。

my_dict = ("tester": 1, "testers": 2,"tester": 14, "testers": 28)
with open('mycsvfile.csv', 'wb') as f:  
    w = csv.DictWriter(f, my_dict[0].keys())
    w.writerow(dict((fn,fn) for fn in my_dict[0].keys()))
    w.writerows(my_dict)

cat mycsvfile.csv
testers,tester
2,1
28,14

【讨论】:

w.writerow(dict((fn,fn) for fn in my_dict.keys())) 很酷,但是 - 为什么不直接打电话给w.writeheader(),它做同样的事情并且更容易理解? :) 转置的字典有什么好处吗?【参考方案4】:

样本数据:

mydict = ["col1": 1000, "col2": 2000, "col1": 3000, "col2": 4000]

使用 pandas 将字典列表转换为 CSV 的单线:

import pandas as pd

pd.DataFrame(mydict).to_csv('out.csv', index=False)

结果:

col1,col2
1000,2000
3000,4000

【讨论】:

【参考方案5】:

最简单的方法

您可以将字典转换为Dataframe并将其写入csv 例如

import pandas as pd
my_dict = "tester": 1, "testers": 2
df=pd.DataFrame(my_dict,index=[0])
df.to_csv("path and name of your csv.csv")

输出

   tester  testers
0       1        2

【讨论】:

【参考方案6】:
d = ['a': 1, 'b': 2,'a': 3, 'b': 4]

with open('csv_file.csv', 'w', newline='\n') as f:
    w = csv.DictWriter(f, d[0].keys())
    w.writeheader()
    for i in d:
        w.writerow(i)

得到你

a,b
1,2
3,4

【讨论】:

您答案的格式似乎被破坏了 - 最后几行缩进了额外的时间:)【参考方案7】:

writerows 的示例:

import csv

def main():

    results = [
            'File': 'test.txt', 'Temperature': 32.33, 'Day': 'Monday',
            'File': 'test2.txt', 'Temperature': 44.33, 'Day': 'Tuesday',
            'File': 'test3.txt', 'Temperature': 44.23, 'Day': 'Sunday'
        ]

    with open('results.csv', 'w') as f:  
        w = csv.DictWriter(f, results[0].keys())
        w.writeheader()        
        w.writerows(results)                    
        
if __name__ == "__main__":
    main()  

这将导致results.csv of:

File,Temperature,Day
test.txt,32.33,Monday
test2.txt,44.33,Tuesday
test3.txt,44.23,Sunday

【讨论】:

【参考方案8】:

打开文件时添加newline="" 参数对我有帮助。

例如:

with open("sample.csv", "w", newline="") as outfile:
    writer = csv.writer(outfile)
    for num in range(0, 10):
        writer.writerow([num])

src

【讨论】:

以上是关于Python 字典到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

将数组写入csv python(一列)

CSV Python 列表

将 Python 字典排列组合到字典列表中

Python - 字典到 YAML 转储 - YAML 不扩展有序字典?

将多个列表写入 csv Python

Python - 将字典列表附加到嵌套的默认字典时出现关键错误