Python字典转CSV文件,以列格式排列

3

我有以下字典

items = {'people': ['Peter', 'Danny'], 'numbers': [1,2,3,4], 'cities': ['London']}

我可以帮助您翻译,并将其转化为以下格式:按列将字典写入CSV文件,具体如下所示:

people,numbers,cities
Peter,1,London
Danny,2,
     ,3,
     ,4,

我的当前方法行不通,因为我按行获取CSV文件:

people,Peter,Danny
numbers,1,2,3,4
cities,London

我应该怎么做才能达成我的目标?

你可以查看pandas包,它有许多方法可以做到这一点。 - Colin Ricardo
4个回答

4
您可以使用 itertools.zip_longest (在Python2中为itertools.izip_longest) 完成此操作:
from itertools import zip_longest
import csv
items = {'people': ['Peter', 'Danny'], 'numbers': [1,2,3,4], 'cities': ['London']}
headers = ['people', 'numbers', 'cities']
with open('filename.csv', 'w') as f:
  full_listing = [['' if not b else b for b in i] for i in zip_longest(*[items[c] for c in headers])]
  write = csv.writer(f)
  write.writerows([headers]+full_listing)

输出:

people,numbers,cities
Peter,1,London
Danny,2,
     ,3,
     ,4,

4

或者您可以使用Pandas处理这个问题,只需两行代码。

import pandas as pd

pd.DataFrame(items).fillna('').to_csv('file_path')

0
一种简单的方法是计算字典中最长列表的长度,然后将 '' 添加到所有列表中,以使它们具有此长度。
num_rows = max((len(x) for x in items.values()))
items = {k: items[k] + [''] * (num_rows - len(items[k])) for k in items}
print(items)
#{'cities': ['London', '', '', ''],
# 'numbers': [1, 2, 3, 4],
# 'people': ['Peter', 'Danny', '', '']}

使用 csv 模块将 dict 写入 csv 文件。

或者,您可以从字典构建一个 pandas DataFrame

import pandas as pd
df = pd.DataFrame(items)
print(df)
#   cities  numbers people
#0  London        1  Peter
#1                2  Danny
#2                3       
#3                4       

现在,您可以使用to_csv()方法将其写入文件。

0

如果您不想依赖外部库,如pandas,则可以使用str对象的join方法在纯Python中快速实现此操作。

items = {'people': ['Peter', 'Danny'],
         'numbers': [1, 2, 3, 4],
         'cities': ['London']}


def to_csv(items):
    # names of columns
    header = ','.join(list(items.keys()))
    # building lines
    lines = list()
    max_len = max([len(items[key]) for key in items.keys()])
    for i in range(max_len):
        lines.append(
            ','.join(
                [str(items[key][i]) for key in items.keys()
                 if i < len(items[key])]))
    # return header and lines separated by new lines
    return '\n'.join([header] + lines)


print(to_csv(items))

输出:

people,numbers,cities
Peter,1,London
Danny,2,
,3,
,4,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接