【问题标题】:List of list of dictionaries to CSV到 CSV 的字典列表列表
【发布时间】:2019-05-04 06:57:44
【问题描述】:

我知道我可以将字典列表直接写入 CSV 文件。同样,是否有一种直接的方法可以将 字典列表列表 写入 python 中的 csv 文件,而无需手动遍历每一行?

样本数据

[[{'e': 46, 'p': 100, 'n': 0, 'a': 100, ...}, 
  {'e': 29, 'p': 40, 'n': 1, 'a': 40, ...}, ...],
 [{...}, ...]

预期格式

e,p,n,a,....
46,100,0,100,....
29,40,1,40,...
.......

注意这不是字典列表,而是字典列表

【问题讨论】:

  • 无论它们是否在子列表中,字典是否都具有相同的格式(即,键是否仍然相同)?
  • @coltonoscopy 是的,所有数据实例都包含相同的字段集

标签: python csv dictionary


【解决方案1】:

如果没有 Pandas,您可以使用 itertools.chain 获取所有字典的扁平列表,然后使用 csv.DictWriter 将其写入您的 CSV 文件:

import csv
from itertools import chain

data = [
    [{'e': 46, 'p': 100, 'n': 0, 'a': 100}, 
     {'e': 29, 'p': 40, 'n': 1, 'a': 40}],
    [{'e': 56, 'p': 200, 'n': 23, 'a': 10}, 
     {'e': 22, 'p': 41, 'n': 11, 'a': 420}]]

fieldnames = ['e', 'p', 'n', 'a']
with open('mydata.csv', 'w') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(chain.from_iterable(data))

输出 (mydata.csv)

e,p,n,a
46,100,0,100
29,40,1,40
56,200,23,10
22,41,11,420

【讨论】:

  • 这就像魅力:) 但是,我在每一行之间都有空行。我可以手动删除它们。但是有什么参数可以摆脱它吗?
  • @ThusithaThilinaDayaratne 我没有得到空行的例子。这很奇怪。
  • 我可以使用 'wb' 而不是 'w' (y) 来删除空行,这似乎是一个系统行终止配置
【解决方案2】:

必须有一种方法可以仅使用核心 Python 来完成您的任务,但我会选择 Pandas:

import pandas as pd
d = yourListOfListsOfDictionaries
df = pd.concat(map(pd.DataFrame, d), sort=True)
#     a   e  n    p
#0  100  46  0  100
#0   40  29  1   40
df.to_csv(index=False)
#'a,e,n,p\n100,46,0,100\n40,29,1,40\n'

【讨论】:

    【解决方案3】:

    如果你希望这组键是字典列表中所有字典的并集,那么你可以这样做:

    import csv
    x = \
    [[{'e': 46, 'p': 100, 'n': 0, 'a': 100},
      {'e': 29, 'p': 40, 'n': 1, 'a': 40}],
     [{'e': 19, 'p': 10, 'n': 1, 'a': 10, 'b':8}]]
    
    key_dict = {}
    for l in x:
        for d in l:
            for k in d:
                key_dict[k] = None
    
    with open('file.csv', 'w') as csvfile:
        writer = csv.DictWriter(csvfile, key_dict.keys())
        writer.writeheader()
        for l in x:
            for d in l:
                writer.writerow(d)
    

    结果:

    a,p,b,e,n
    100,100,,46,0
    40,40,,29,1
    10,10,8,19,1
    

    【讨论】:

      【解决方案4】:

      如果字典具有相同的格式,只需像这样展平列表(假设它确实是一个列表列表,二维):

      data = [
          [{'a': 10, 'b': 20, 'c': 30}],
          [{'a': 20, 'b': 30, 'c': 40},
           {'a': 30, 'b': 40, 'c': 50}]
      ]
      rows = [item for sublist in data for item in sublist]
      

      然后将您的行写入 CSV:

      with open('my_data.csv', 'wb') as output_file:
          dict_writer = csv.DictWriter(output_file, rows[0].keys())
          dict_writer.writeheader()
          dict_writer.writerows(rows)
      

      以下两个帖子的组合:

      How to make a flat list out of list of lists?

      How do I convert this list of dictionaries to a csv file?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2015-12-17
        相关资源
        最近更新 更多