Python字典到CSV

Python字典到CSV,python,csv,dictionary,Python,Csv,Dictionary,我已经编写了将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]

我已经编写了将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写入任何内容,尽管它将打印一个。我相信这与字典的无序有关。我真的需要写出fID和与每个fID相关联的每个键(fClassRange ex.“5.0到5.25”),然后将与每个fClassRange相关联的值fArea写入CSV,但我的代码中甚至没有写那么多,因为我甚至不知道如何写出fID


我研究了如何使用
DictWriter
,但我不知道如何告诉它所需的字段名是什么

默认编写器需要一个列表,这就是它不适合您的原因。要使用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
    )
或者,如果您知道字段应该是什么,您可以将
字段名设置为
字段名=[“任意”、“列表”、“of”和“键”]

对于后代:

您应该使用iteritems()在字典上迭代,这样最后一部分就变成

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

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

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
样本数据:

mydict=[{“col1:1000”,col2:2000},{“col1:3000”,col2:4000}]
一个用于使用pandas将DICT列表转换为CSV的行程序:

结果:

col1,col2
1000,2000
3000,4000
最简单的方法

您可以将字典转换为Dataframe并将其写入csv 乙二醇

输出

   tester  testers
0       1        2
明白了吗

a,b
1,2
3,4

哇,谢谢!但现在我收到了这样一条消息:ValueError:dict包含字段名中没有的字段:4,6,3,3,9@bojo哎呀!你在口述口述。因此,要获得正确的字段名,您需要内部字典字段名。此外,每个字典必须具有相同的字段名。否则,您需要使用DictWriter选项来处理不正确的字段名。我已更新该行以使用正确的字典获取字段名。很抱歉,斯宾塞,我仍然收到相同的ValueError消息。@bojo-Hmm,在您的
itemDict[fid]=
行中,您将新字典的字段名设置为一些默认值。你能用列表中的那些作为你的字段吗?不要忘记之后添加的fClassRange字段。或者,将打印语句更改为
print a.keys()
,然后使用它。我真的非常感谢您的帮助。我尝试将“print a”更改为“print a.keys()”,只是为了看看发生了什么,结果是:AttributeError:'str'对象没有属性'keys'——这可能表明存在问题?我还尝试使用DictWriter语句,其中“fieldnames=myFieldnames”和“myFieldnames”等于您建议的默认类范围列表,但我仍然得到相同的ValueError。我必须推荐Kenneth Reitz。它比你在这里寻找的要多,所以这不是一个直接的答案,只是想向其他人推荐这个库。它有一个很棒的、易于使用的API,您可以轻松地序列化为csv、tsv、json、yaml和xlsx。您答案上的格式似乎被破坏了-最后几行被额外缩进:)
w.writerow(dict((fn,fn)for fn in my_dict.keys())
很酷,但是-为什么不直接调用
w.writeheader()
,它做同样的事情,更容易理解?:)转置的dict有好处吗?
   tester  testers
0       1        2
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