简体   繁体   English

Python 字典转 CSV

[英]Python Dictionary to CSV

I have written code to read a CSV into a python dictionary, which works fine.我已经编写了将 CSV 读入 python 字典的代码,效果很好。 I'm trying to get the dictionary back to a CSV.我正在尝试将字典恢复为 CSV。 I have written the following:我写了以下内容:

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)

In the last block, listWriter will not write anything to the CSV though it will print a.在最后一个块中,listWriter 不会向 CSV 写入任何内容,尽管它会打印 a。 I believe this has something to do with a dictionary being unordered.我相信这与字典无序有关。 I really need to write out the fID and each of the keys associated with each fID (fClassRange ex. "5.0 to 5.25") and then the value fArea associated with each fClassRange to the CSV, but I haven't even gotten that far in my code since I can't figure out how to write out even the fID.我真的需要写出 fID 和与每个 fID 关联的每个键(fClassRange 例如“5.0 到 5.25”),然后将与每个 fClassRange 关联的值 fArea 写出到 CSV,但我什至还没有深入我的代码,因为我什至不知道如何写出 fID。

I looked into using DictWriter , but I can't figure out how to tell it what the required fieldnames are.我研究过使用DictWriter ,但我不知道如何告诉它所需的字段名是什么。

The default writer expects a list, which is why it won't work for you.默认编写器需要一个列表,这就是它不适合您的原因。 To use the dictwriter, just change your listwriter = line to this:要使用 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
    )

Or, you can just set fieldnames to be fieldnames=['arbitrary','list','of','keys'] if you know what the fields are supposed to be.或者,您可以将fieldnames设置为fieldnames=['arbitrary','list','of','keys']如果您知道这些字段应该是什么。

Sample data:样本数据:

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

One-liner for converting a list of dicts to CSV, using pandas:使用 Pandas 将 dicts 列表转换为 CSV 的单行:

import pandas as pd

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

Results:结果:

col1,col2
1000,2000
3000,4000

This is what i use, its simple and works fine for me.这就是我使用的,它很简单,对我来说很好用。 when you have only one dictionary, use this当你只有一本字典时,用这个

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

When you have a list of dictionaries, like what you get from SQL queries, you do like this.当你有一个字典列表时,比如你从 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

For posterity:为后人:

You should use iteritems() to iterate over a dictionary, so the last part becomes你应该使用 iteritems() 来遍历字典,所以最后一部分变成

for name, values in itemDict.iteritems():
    print values
    listWriter.writerow(values)
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)

gets you得到你

a,b
1,2
3,4

An example with writerows :一个带有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()  

which will result in results.csv of:这将导致results.csv

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

What helped me is adding newline="" argument when opening file.帮助我的是在打开文件时添加newline=""参数。

ex:前任:

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

src 源文件

Easiest Way最简单的方法

You can convert the dictionary into Dataframe and write it to csv Eg您可以将字典转换为 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")

output输出

   tester  testers
0       1        2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM