【问题标题】:How do I convert this list of dictionaries to a csv file?如何将此字典列表转换为 csv 文件?
【发布时间】:2011-03-06 10:39:30
【问题描述】:

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

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

我应该怎么做才能将其转换为如下所示的 csv 文件:

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

【问题讨论】:

标签: python csv dictionary data-conversion


【解决方案1】:
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)

【讨论】:

  • 嵌入数据时有没有办法做到这一点?例如,如果数组中的每个条目都是 {{"first":"John", "last": "Doe"}, uri} 但您希望 csv 仅包含第一个和最后一个数据?
  • 如果字典的值中有西里尔文符号,如何将这样的文件写入 CSV 格式?我试过 .encode('utf-8') 但不幸的是 CSV 文件中的值没有正确显示。
  • 此程序以相反的顺序写入输出,例如 weightage name weight 25 bob 200 31 jim 180
  • 如果第一个列表项不包含所有键则不起作用
  • set().union(*(d.keys() for d in mylist)) 获取列表中的所有键(如果您有一些没有所有键。)
【解决方案2】:

在 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,并找出标题。
  • 数据框与 CSV 提供的结构不同,因此您在加载时添加一行以获得相同的内容:dataframe.to_dict('records')
  • pandas 还可以更轻松地控制 csv 文件中的列顺序。默认情况下,它们是按字母顺序排列的,但您可以指定列顺序。使用 vanilla csv 模块,您需要为其提供 OrderedDict 或者它们将以随机顺序出现(如果在 python Preserving column order in Python Pandas DataFrame 了解更多信息。

【讨论】:

  • list_of_dictionaries 是如何写入 CSV 的?我无法理解第二个代码示例。
  • @IainSamuelMcLeanElder .to_dict 以多种格式之一返回您的数据框,具体取决于您指定的格式。 ('records') 返回一个字典列表,其中每列是一个字典,.to_dict('index') 返回一个字典字典,顶级键是索引值,嵌套字典是 column:value 对。根据您导出 csv 的方式,您可以选择 CSV 函数所期望的结构。
  • 您的第二个代码示例似乎没有回答 OP 的问题。它不应该在某个地方使用from_dict 吗?我有同样的问题,这对我有用。很高兴了解 to_dict,但它似乎更适合阅读,而不是写作。
【解决方案3】:

这是当你有一个字典列表时:

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'})

【讨论】:

    【解决方案4】:

    因为@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)
    

    【讨论】:

      【解决方案5】:

      这是另一个更通用的解决方案,假设您没有行列表(可能它们不适合内存)或标题副本(可能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)]) 表单。

      【讨论】:

      • 以前从未见过有人将数据存储在生成器中 - 有趣的方法。
      【解决方案6】:
      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 文件的最简单方法

      【讨论】:

        【解决方案7】:
        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)
        

        【讨论】:

          猜你喜欢
          • 2018-12-13
          • 2014-03-01
          • 2019-02-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          • 1970-01-01
          • 2014-04-24
          相关资源
          最近更新 更多