将元组数组的字典转换为CSV

时间:2016-09-19 23:23:01

标签: python csv dictionary

我正在尝试转换像这样的字典:

{
    'AAA': [ ('col1', 1), ('col2', 2), ('col3', 3) ],
    'BBB': [ ('col2', 1), ('col3', 4) ],
    'CCC': [ ('col4', 7) ]
}

...进入如下结构的csv:

key  col1, col2, col3, col4
AAA  1     2     3
BBB        1     4
CCC                    7

具体来说,我不知道列的名称是什么,或者需要创建哪些列,直到运行时,key列除外,它直接对应于键。如果没有为给定列提供数据,则认为它是空的。

在Python中有一种简单的方法吗?我试图避免过度地将数据重新混合到不同的结构中,我看到的所有numpy示例都涉及并行列表。我愿意使用像numpy和pandas这样的库。

1 个答案:

答案 0 :(得分:1)

在没有首先处理字典的情况下,没有一种简单的方法可以满足您的要求。

Python有一个csv库:https://docs.python.org/2/library/csv.html但您必须在使用之前以正确的格式保存数据。你最好的选择是DictWriter类,它可以将dict作为每一行。你的元组可以很容易地转换为dicts,所以你需要能够使用这个类来获得字段名列表(列名)。

以下是我将您的信息打印到csv中的方式:

from csv import DictWriter

d = { 'AAA': [ ('c1', 1), ('c2', 2), ('c3', 3)],
      'BBB': [ ('c2', 1), ('c3', 4)],
      'CCC': [ ('c4', 7)]
    }

# convert dictionary of tuples into list of dictionaries
# and gather fieldnames at the same time
rows = []
fieldnames = set()
for k in d.keys():
    # a list of (k, v) tuples can be converted to a dict
    # but watch out for duplicate keys!
    tmp = dict(d[k])
    fieldnames.update(tmp.keys())
    tmp['key'] = k
    rows.append(tmp)

# add key to the front of the list, since sets are unordered
# you could sort the fieldnames however you want here
fieldnames = ['key'] + list(fieldnames)                                                                 

# open the file and write the csv
with open('out.csv', 'w') as csvfile:
    writer = DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    for row in rows:
        writer.writerow(row)