在Python中把Dict转换为CSV的7种最佳方法

9,378 阅读5分钟

💬 问题:如何在 Python 中把一个字典转换为 CSV 文件?

在 Python 中,使用 csv 模块中的 DictWriter() 方法将一个 dictionary 转换为 CSV 文件。csv.DictWriter() 方法允许你使用其DictWriter.writerow() 方法将字典格式的行 (key=列名;value=行元素) 插入 CSV 文件中。

方法1:在Pandas中把Python字典转换成CSV文件

首先,将字典列表转换PandasDataFrame,它为你提供了强大的功能,如

其次,使用DataFrame的to_csv() 方法,以文件名为参数,将Pandas DataFrame转换为CSV文件

salary = [{'Name':'Alice', 'Job':'Data Scientist', 'Salary':122000},
          {'Name':'Bob', 'Job':'Engineer', 'Salary':77000},
          {'Name':'Carl', 'Job':'Manager', 'Salary':119000}]


# Method 1
import pandas as pd
df = pd.DataFrame(salary)
df.to_csv('my_file.csv', index=False, header=True)

输出。

Name,Job,Salary
Alice,Data Scientist,122000
Bob,Engineer,77000
Carl,Manager,119000

你创建了一个Pandas DataFrame--它是Python对表格数据的默认表示。把它想象成你代码中的Excel电子表格(有行和列)。

DataFrame是一个非常强大的数据结构,允许你执行各种方法。其中之一是 [to_csv()](https://blog.finxter.com/pandas-to_csv/)方法,允许你将其内容写入CSV文件中。

  • 你将to_csv() 方法的参数index 设置为False ,因为 Pandas 默认会添加整数的行和列索引 0, 1, 2, ....还是那句话,把它们看作是你Excel表格中的行和列索引。你不希望它们出现在CSV文件中,所以你把参数设置为False
  • 你将和header 参数设置为True ,因为你想将dict作为CSV的标题。

如果你想自定义CSV的输出,你有很多特殊参数可以玩。

方法 2:字典到 CSV 文件

在 Python 中,使用 csv 模块中的 DictWriter() 方法将一个字典转换为 CSV 文件。csv.DictWriter() 方法允许你使用其DictWriter.writerow() 方法向 CSV 文件插入数据。

下面的例子把 dictionary 写到 CSV 中,用键作为列名,值作为行值。

import csv


data = {'A':'X1', 'B':'X2', 'C':'X3'}

with open('my_file.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=data.keys())
    writer.writeheader()
    writer.writerow(data)

结果文件'my_file.csv' ,看起来像这样。

[csv](https://docs.python.org/3/library/csv.html)库可能还没有安装在你的机器上。要检查它是否被安装,请遵循这些指示。如果没有安装,在你的 shell 或终端中运行pip install csv 来修复它。

方法 3: Dict 到 CSV 字符串 (在内存中)

要在内存中把 dict 列表转换为 CSV 字符串,即返回一个 CSV 字符串,而不是写进一个 CSV 文件,使用pandas.DataFrame.to_csv() 函数,不需要文件路径参数。返回值是字典的 CSV 字符串表示。

这里有一个例子。

import pandas as pd


data = [{'A':'X1', 'B':'X2', 'C':'X3'},
        {'A':'Y1', 'B':'Y2', 'C':'Y3'}]

df = pd.DataFrame(data)
my_csv_string = df.to_csv(index=False)

print(my_csv_string)
'''
A,B,C
X1,X2,X3
Y1,Y2,Y3
'''

我们传递index=False ,因为我们不希望在每一行前面有一个索引0、1、2。

方法 4: Dict 到 CSV 附加行

要将字典追加到现有的 CSV 中,可以用open('my_file.csv', 'a', newline='')追加模式打开文件对象,用csv.DictWriter() 来追加一个 dict 行,用DictWriter.writerow(my_dict)

给出以下文件'my_file.csv'

你可以通过这个代码片断向CSV文件追加一行(dict)。

import csv


row = {'A':'Y1', 'B':'Y2', 'C':'Y3'}

with open('my_file.csv', 'a', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=row.keys())
    writer.writerow(row)

在与你的原始'my_file.csv' 相同的文件夹中运行该代码后,你会看到以下结果。

方法 5:Dict 到 CSV 列

要在 CSV 文件中把 Python 字典写成列,即每行一个*(key, value)*对,使用下面三个步骤。

  • 在写作模式下打开文件,并使用newline='' 参数来防止空行。
  • 创建一个CSV写入器对象。
  • 遍历字典中的(键,值)对,使用 [dict.items()](https://blog.finxter.com/python-dict-items-method/)方法对字典中的(key, value)对进行迭代。
  • 通过在writer.writerow() 方法中传递,一次写一个(key, value) 元组。

下面是代码示例。

import csv

data = {'A':42, 'B':41, 'C':40}

with open('my_file.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in data.items():
        writer.writerow(row)

你的输出CSV文件(列dict)看起来像这样。

方法6:带标题的Dict到CSV

使用csv.DictWriter(fileobject, fieldnames) 方法将 Python 字典转换为带有页眉的 CSV 文件,通过writer.writeheader() 创建一个用于写页眉的写作者对象,不需要参数。这样就写下了作为fieldnames 传递的列名列表,例如,通过以下方式获得的字典的键值 [dict.keys()](https://blog.finxter.com/python-dict-keys-method/).

要写行,你可以接着调用DictWriter.writerow() 方法。

下面的例子把 dictionary 写到 CSV 中,用键作为列名,值作为行值。

import csv


data = {'A':'X1', 'B':'X2', 'C':'X3'}

with open('my_file.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=data.keys())
    writer.writeheader()
    writer.writerow(data)

结果文件'my_file.csv' 看起来像这样。

下一步该怎么做

如果你还没有找到你的解决方案,你可能想看看我关于如何将字典列表写入 CSV 的深入指南。

奖励方法 7: Vanilla Python

如果你不想导入任何库,但仍然想把dicts列表转换成CSV文件,你也可以使用标准的Python实现:它并不复杂,而且非常高效。

如果你不会或不能使用外部依赖性,这种方法是最好的。

  • f 在写入模式下使用标准的 [open()](https://blog.finxter.com/python-open-function/)函数打开文件。
  • 使用单行表达式f.write(','.join(salary[0].keys())) 在文件中写入第一个 dictionary 的键。
  • 遍历字典列表,用表达式f.write(','.join(str(x) for x in row.values())) 将值写入 CSV 中。

下面是具体的代码例子。

salary = [{'Name':'Alice', 'Job':'Data Scientist', 'Salary':122000},          {'Name':'Bob', 'Job':'Engineer', 'Salary':77000},          {'Name':'Carl', 'Job':'Manager', 'Salary':119000}]


# Method 3
with open('my_file.csv','w') as f:
    f.write(','.join(salary[0].keys()))
    f.write('n')
    for row in salary:
        f.write(','.join(str(x) for x in row.values()))
        f.write('n')

输出

Name,Job,Salary
Alice,Data Scientist,122000
Bob,Engineer,77000
Carl,Manager,119000

在代码中,你首先打开文件对象f 。然后你遍历每一行和行中的每一个元素,并逐一将元素写入文件。在每个元素之后,你放置逗号以生成CSV文件格式。在每一行的后面,你放置换行符'n'

注意:为了摆脱尾部的逗号,你可以在循环体中检查元素x 是否是该行的最后一个元素,如果是就跳过写逗号。