如何将此词典列表转换为csv文件?

kzipqqlq  于 2022-12-06  发布在  其他
关注(0)|答案(8)|浏览(144)

我有一个字典列表,看起来像这样:

toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]

我应该做什么来转换成一个csv文件,看起来像这样:

name,age,weight
bob,25,200
jim,31,180
iklwldmw

iklwldmw1#

import csv

to_csv = [
    {'name': 'bob', 'age': 25, 'weight': 200},
    {'name': 'jim', 'age': 31, 'weight': 180},
]

keys = to_csv[0].keys()

with open('people.csv', 'w', newline='') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(to_csv)
acruukt9

acruukt92#

在python 3中,情况稍有不同,但更简单,更不容易出错。告诉CSV你的文件应该用utf8编码打开是个好主意,因为这会使数据更容易被其他人移植(假设你没有使用更严格的编码,比如latin1

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
with open('people.csv', 'w', encoding='utf8', newline='') as output_file:
    fc = csv.DictWriter(output_file, 
                        fieldnames=toCSV[0].keys(),

                       )
    fc.writeheader()
    fc.writerows(toCSV)
  • 请注意,python 3中的csv需要newline=''参数,否则在excel/opencalc中打开时,CSV中会出现空行。

或者:我更喜欢使用pandas模块中的csv处理程序。我发现它更能容忍编码问题,而且Pandas会在加载文件时自动将CSV中的字符串数字转换为正确的类型(int、float等)。

import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)

注意事项:

  • 如果你给予它一个路径,pandas会帮你打开文件,在python3中默认为utf8,并且也会弄清楚文件头。
  • Dataframe 的结构与CSV提供的结构不同,因此在加载时添加一行,以获得相同的结果:dataframe.to_dict('records')
  • pands也使得控制csv文件中列的顺序变得更加容易。默认情况下,它们是按字母顺序排列的,但是你可以指定列的顺序。对于vanilla csv模块,你需要给它一个OrderedDict,否则它们将以随机顺序出现(如果在python 3.5以下的版本中工作)。请参见:Preserving column order in Python Pandas DataFrame以获取更多信息。
vyu0f0g1

vyu0f0g13#

这时您只有一个字典列表:

import csv
with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
ntjbwcob

ntjbwcob4#

因为@User和@BiXiC在这里寻求UTF-8的帮助,这是@Matthew解决方案的变体。(我不允许发表评论,所以我在回答。)

import unicodecsv as csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)
utugiqy6

utugiqy65#

下面是另一个更通用的解决方案,假设您没有行的列表(可能它们不适合内存)或头文件的副本(可能write_csv函数是通用的):

def gen_rows():
    yield OrderedDict(name='bob', age=25, weight=200)
    yield OrderedDict(name='jim', age=31, weight=180)

def write_csv():
    it = genrows()
    first_row = it.next()  # __next__ in py3
    with open("people.csv", "w") as outfile:
        wr = csv.DictWriter(outfile, fieldnames=list(first_row))
        wr.writeheader()
        wr.writerow(first_row)
        wr.writerows(it)
  • 注意 *:这里使用的OrderedDict构造函数只在python 3.4以上版本中保留顺序。如果顺序很重要,请使用OrderedDict([('name', 'bob'),('age',25)])形式。
l5tcr1uw

l5tcr1uw6#

import csv

with open('file_name.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(('colum1', 'colum2', 'colum3'))
    for key, value in dictionary.items():
        writer.writerow([key, value[0], value[1]])

这是将数据写入**.csv**文件的最简单方法

lf5gs5x2

lf5gs5x27#

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
header=['name','age','weight']     
try:
   with open('output'+str(date.today())+'.csv',mode='w',encoding='utf8',newline='') as output_to_csv:
       dict_csv_writer = csv.DictWriter(output_to_csv, fieldnames=header,dialect='excel')
       dict_csv_writer.writeheader()
       dict_csv_writer.writerows(toCSV)
   print('\nData exported to csv succesfully and sample data')
except IOError as io:
    print('\n',io)
jdgnovmf

jdgnovmf8#

Pandas的一个简短解决方案

import pandas as pd

list_of_dicts = [
    {'name': 'bob', 'age': 25, 'weight': 200},
    {'name': 'jim', 'age': 31, 'weight': 180},
]

df = pd.DataFrame(list_of_dicts) 
df.to_csv("names.csv", index=False)

相关问题