【问题标题】:dictionary key and values to CSV字典键和值到 CSV
【发布时间】:2021-03-27 10:54:57
【问题描述】:

我有一本字典:

{1: ['company_name1', 'address1, number1 St Street, London', '+44 20 0000 5111', 'emailname@company1'], 2: ['company_name2', 'address2, number2 St Street, London', '+44 20 0200 5111', 'emailname@company2.com'],

我想在 CSV 文件中获取以下内容: *每个 |是一列

'ID'|'NAME'| 'ADDRESS'| 'PHONE'| 'EMAIL' |(headers in each column)

1| company_name1| address1 number1 St Street London| +44 20 0000 5111 | emailname@company1

2| company_name2| address2 number2 St Street London| +44 20 0200 5111 | emailname@company2.com

我试过了:

csv_columns = ['ID','NAME', 'ADDRESS', 'PHONE', 'EMAIL']
    with open('some_name.csv', 'w', newline='') as csvfile:

    my_writer = csv.writer(csvfile, delimiter='\t', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for key, val in my_dict.items():
        my_writer.writerow([key] + val)

但它混合了单元格中的所有数据,例如:

1| company_name1address1 number1 St Street London| +44 20 0000 5111 emailname@company1

2| company_name2| address2 number2 St Street London +44 20 0200 5111 emailname@company2.com

我能做什么?以及如何添加标题?

【问题讨论】:

  • 标头从何而来?
  • 你用的是什么版本的 Python?
  • 如果要|分隔列,为什么要将分隔符指定为\t
  • 标头来自:csv_columns = ['ID','NAME', 'PHONE', 'ADDRESS', 'EMAIL']
  • 来自一个你懒得提的变量:明白了。

标签: python dictionary export-to-csv


【解决方案1】:

这不是最快的方法,但它可能会教你一些新技巧:

import csv

# my usual csv function
def write_csv(data: dict, path: str):
    with open(path, 'w') as file:
        # get all the keys
        fieldnames = set().union(*data)
        writer = csv.DictWriter(file,
                                fieldnames=fieldnames,
                                lineterminator='\n')
        writer.writeheader()
        writer.writerows(data)


headers = ['id', 'name', 'address', 'phone', 'email']

data = {
    1: [
        'company_name1',
        'address1, number1 St Street, London',
        '+44 20 0000 5111',
        'emailname@company1.com'
    ],
    2: [
        'company_name2',
        'address2, number2 St Street, London',
        '+44 20 0200 5111',
        'emailname@company2.com'
    ],
 }

# crazy cool comprehension to transform the data shape
new_data = [{header: value
             for header, value in zip(headers, [key, *values])}
            for key, values in data.items()]

write_csv(new_data, './data.csv')

输出 csv:

name,address,id,email,phone
company_name1,"address1, number1 St Street, London",1,emailname@company1.com,+44 20 0000 5111
company_name2,"address2, number2 St Street, London",2,emailname@company2.com,+44 20 0200 5111

转换后的字典的漂亮打印:

[{'address': 'address1, number1 St Street, London',
  'email': 'emailname@company1.com',
  'id': 1,
  'name': 'company_name1',
  'phone': '+44 20 0000 5111'},
 {'address': 'address2, number2 St Street, London',
  'email': 'emailname@company2.com',
  'id': 2,
  'name': 'company_name2',
  'phone': '+44 20 0200 5111'}]

【讨论】:

  • @Piwero 很高兴知道它有效!需要记住的一点是,如果您的数据非常庞大,这可能不是最有效的方法。
【解决方案2】:

你可以这样做:

my_dict = {1: ['company_name1', 'address1, number1 St Street, London', '+44 20 0000 5111', 'emailname@company1'], 
            2: ['company_name2', 'address2, number2 St Street, London', '+44 20 0200 5111', 'emailname@company2.com']}

with open('some_name.csv', 'w', newline='') as csvfile:
    my_writer = csv.writer(csvfile, delimiter='\t', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for key, val in my_dict.items():
        my_writer.writerow([key, val[0], val[1], val[2], val[3]])

【讨论】:

  • 我不知道为什么仍然在同一个单元格中随机混合键和值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多