如何按键对不均匀字典进行排序并创建CSV

2024-04-25 04:57:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python字典,对于每个键,每个键可以有不同数量的值(以列表形式排列)。在

例如:

^{1}$

我想用如下格式生成此信息的CSV:

^{pr2}$

目前我的代码可以生成这样的CSV,唯一的问题是CSV的列没有按照键的升序数字顺序排序。目前我的代码如下:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter = ',')

    # Format headers for aesthetics
    csv_headers = [' {} '.format(elem) for elem in dictionary.keys()]

    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*dictionary.values(), fillvalue = '     ')
    writer.writerows(csv_data)

如您所见,我将键与值分开,并分别编写它们,但如果我想按键对列进行排序,我想这可能不是最好的方法。因此,我希望有人能给我指一个正确的(也是最Python式的)方向。在


Tags: csv代码formatfordatadictionary字典排序
2条回答

我进行排序,最后得到一个key和一个{}的转置元组,然后从那里开始:

import csv
from itertools import izip_longest

d = {'607': [36146], '448': [50890, 44513], '626': [44349, 44436]}

with open('output.csv', 'wb') as fout:
    csvout = csv.writer(fout)
    header, rows = zip(*sorted((k, iter(v)) for k, v in d.iteritems()))
    csvout.writerow(format(el, '^5') for el in header)
    csvout.writerows(izip_longest(*rows, fillvalue='     '))

您有两种选择:

  • 对键排序,然后按相同的顺序提取值,而不是依赖dictionary.values()
  • 使用^{} object并为每行生成字典。在

选项1如下:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter=',')

    keys = sorted(dictionary) 
    # Format headers for aesthetics
    headers = [' {} '.format(key) for key in keys]
    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*(dictionary[key] for key in keys),
                                      fillvalue='     ')
    writer.writerows(csv_data)

使用DictWriter将如下所示:

^{pr2}$

相关问题 更多 >