如何在Python中把Dicts列表转换成CSV文件[4种方法]

406 阅读5分钟

问题:如何将字典 列表转换为csv 文件?

例子:给出的是一个dict列表--例如某公司员工的工资数据。

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

你的目标是将字典列表的内容写成逗号分隔的值(CSV)文件格式。你的输出文件应该是这样的。

**my_file.csv**:

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

解决方案: 有四种简单的方法可以在Python 中把 dicts列表转换成 CSV 文件。

  1. Pandas:导入pandas 库,创建一个 Pandas DataFrame,并使用 DataFrame 方法DataFrame.to_csv('my_file.csv') 将 DataFrame 写到一个文件。
  2. CSV:在Python中导入csv 模块,创建一个CSVDictWriter 对象,并使用writer对象上的writerows() 方法将dict列表写到文件中。
  3. Python。使用纯Python实现,通过使用Python文件I/O功能,不需要任何库。
  4. 减少问题:你可以先将dicts列表转换为列表,将列表写到CSV中。

我更倾向于方法1(Pandas),因为它使用最简单,最简洁,而且对不同的输入类型(数字或文本)最稳健。

方法1:Pandas DataFrame to_csv()

你可以将一个列表转换为 PandasDataFrame,为你提供强大的功能,如to_csv() 方法。这是最简单的方法,它可以让你避免导入另一个库(反正我在许多 Python 项目中都使用 Pandas)。

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的标题。

方法2:Python CSV模块DictWriter

你可以在Python中轻松地将一个dicts列表转换为CSV文件--通过使用 csv库。这是所有四种方法中最可定制的。

这里有六个简单的步骤,将一个dict列表转换为带有标题行的CSV。

  1. 用 import csv 导入 CSV 库。
  2. 使用表达式open('my_file.csv', 'w', newline='') ,打开CSV文件。你需要换行参数,因为否则,你可能会在Windows中看到行之间的空行。
  3. 创建一个csv.DictWriter() 对象,传递文件和fieldnames 参数。
  4. 使用表达式salary[0].keys()fieldnames 参数设置为第一个 dictionary 的键。
  5. 用以下方法写头writer.writeheader()
  6. 写出字典的列表,使用writer.writerows()

下面是复制&粘贴的完整代码。

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


# Method 2
import csv
with open('my_file.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=salary[0].keys())
    writer.writeheader()
    writer.writerows(salary)

输出文件命名为'my_file.csv' 并位于同一文件夹中。

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

你可以在CSV写入器的构造函数中定制它(例如,将分隔符从逗号',' 修改为空白' ' 字符)。

方法3:没有外部依赖的纯Python

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

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

  • f 在写入模式下使用标准的 [open()](https://blog.finxter.com/python-open-function/)函数打开文件。
  • 使用单行表达式f.write(','.join(salary[0].keys())) 在文件中写入第一个 dictionary 的键。
  • 遍历dicts 列表,用表达式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 是否是该行的最后一个元素,如果是就跳过写逗号。

方法4:先转换为列表的列表

将dict列表转换为CSV文件的一个简单方法是,首先将dict列表转换为列表,然后使用下面文章中讨论的方法(给出的代码块)。

salary = [['Alice', 'Data Scientist', 122000],
          ['Bob', 'Engineer', 77000],
          ['Ann', 'Manager', 119000]]


# Method 1
import csv
with open('file.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(salary)


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


# Method 3
a = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]


import numpy as np
a = np.array(a)
np.savetxt('file3.csv', a, delimiter=',')


# Method 4
with open('file4.csv','w') as f:
    for row in salary:
        for x in row:
            f.write(str(x) + ',')
        f.write('\n')