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的主要内容,如果未能解决你的问题,请参考以下文章