【问题标题】:Convert list of dictionaries to csv file将字典列表转换为 csv 文件
【发布时间】:2019-02-01 09:24:23
【问题描述】:

我有一个此类词典的列表:

[
{'site1':'data1'},
{'site2':'data2'}
]

按此顺序生成包含数据的 csv 文件的正确方法是什么? :

row 1      row2
site1      data1
site2      data2

【问题讨论】:

    标签: python list csv dictionary


    【解决方案1】:

    遍历字典并将它们写入文件。

    list_of_dicts = [{'site1':'data1'},{'site2':'data2'}]
    with open('sites.csv', 'w') as file:
        file.write('row1\trow2\n')
        for dictionary in list_of_dicts:
             file.write('\t'.join(list(dictionary.items())[0]) + '\n')
    

    输出:

    row1    row2
    site1   data1
    site2   data2
    

    请注意,这要求每个字典中只有一个条目,如果有更多条目,则随机选择一个,而忽略其他条目。有许多不同的方法可以处理它们在字典中的多个条目,因此您必须将预期的行为添加到问题陈述中以适应这些情况。

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:)

      data = [ {'site1':'data1'}, {'site2':'data2'} ]
      
      with open ('list.csv', 'w') as f:
          for dict in data:
              for key, value in dict.items():
                  text = key+','+value+'\n'
                  f.writelines(text)
      

      【讨论】:

      • 这假定数据不包含逗号、引号或换行符。大多数情况下是无害的,但 CSV 行应该以 \r\n 结尾。如果保证数据不包含这些特殊字符,则此方法有效。但这不是一个好的通用解决方案。
      【解决方案3】:

      我喜欢使用pandas的数据框来制作我的数据并将它们写入csv文件

      a = [{'site1':'data1'},{'site2':'data2'}]
      #Get each key and values from each dictionaries in the list
      keys = []
      vals = []
      for a1 in a:
          for k, v in a1.items():
              keys.append(k)
              vals.append(v)
      #make the dataframe from the keys and values
      result = pd.DataFrame({'row1': keys, 'row2':vals})
      #write the data into csv, use index=False to not write the row numbers
      result.to_csv("mydata.csv", index=False)
      

      【讨论】:

      • 构造DataFrame的另一种方法是pd.DataFrame([i for a1 in a for i in a1.items()], columns=['row1', 'row2'])
      【解决方案4】:

      您应该使用 CSV 编写器确保任何嵌入的元字符(例如逗号和引号)都正确转义,否则 {'site3':'data, data and more data'} 等数据会损坏文件。

      import csv
      
      my_list = [{'site1':'data1'}, {'site2':'data2'}]
      
      with open('test.csv', 'w', newline='') as out_fp:
          writer = csv.writer(out_fp)
          for d in my_list:
              writer.writerows(d.items())
      

      如果你愿意,你可以用itertools 把它缩短一点

      import itertools
      
      with open('test.csv', 'w', newline='') as out_fp:
          csv.writer(out_fp).writerows(itertools.chain.from_iterable(
              d.items() for d in my_list))
      

      【讨论】: