Python字典转CSV

46 投票
8 回答
57370 浏览
提问于 2025-04-17 07:25

我写了一段代码,可以把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会打印出a,但它却没有把任何东西写入CSV文件。我觉得这可能和字典是无序的有关。我真的需要把fID和每个与fID相关的键(比如fClassRange,像“5.0到5.25”)写入CSV,然后再把每个fClassRange对应的值fArea也写进去,但我连fID都没法写出来,所以还没做到这一步。

我考虑过使用DictWriter,但我不知道怎么告诉它需要哪些fieldnames

8 个回答

5

这里有一个使用 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 的文件,内容如下:

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

默认的写入器是需要一个列表的,这就是它不能正常工作的原因。要使用字典写入器,只需要把你的 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']

36

示例数据:

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

用一行代码把字典列表转换成CSV格式,使用pandas库:

import pandas as pd

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

结果:

col1,col2
1000,2000
3000,4000

撰写回答