如何用Python将CSV转换为字典

340 阅读3分钟

将 CSV 文件转换为 Python 字典的最好方法是使用open("my_file.csv") 创建一个 CSV 文件对象f 并将其传入csv.DictReader(f) 方法。返回值是一个可迭代的字典,在 CSV 文件中每行一个,它将第一行的列头映射到特定的行值。

接下来让我们看一下一个简单的例子来演示这个解决方案吧

基本解决方案。CSV到Dict的例子

下面是一个CSV文件的内容,"my_file.csv" ,用于我们下面的代码片断。

Name,Job,Age,Income
Alice,Programmer,23,110000
Bob,Executive,34,90000
Carl,Sales,45,50000

如果你把这个CSV文件以表格的形式可视化,它看起来像这样。

名称工作年龄收入
爱丽丝程序员23110000
鲍勃行政人员3490000
卡尔销售人员4550000

下面是将CSV文件转换成多个字典的代码,通过使用csv.DictReader(file) 函数,每行一个字典

import csv


csv_filename = 'my_file.csv'

with open(csv_filename) as f:
    reader = csv.DictReader(f)

    for row in reader:
        print(row)

字典是一个数据结构,它将键映射到值。

前面的代码片段的输出显示了CSV的第一行是如何被用作头来确定字典的键,这些键被映射到CSV文件的各个行中定义的值。

{'Name': 'Alice', 'Job': 'Programmer', 'Age': '23', 'Income': '110000'}
{'Name': 'Bob', 'Job': 'Executive', 'Age': '34', 'Income': '90000'}
{'Name': 'Carl', 'Job': 'Sales', 'Age': '45', 'Income': '50000'}

csv.DictReader(f) 方法需要一个文件对象f 作为输入参数。因此,你首先需要使用内置的Python [open()](https://blog.finxter.com/python-open-function/)函数。

🪲 注意:一个常见的错误是把文件名作为一个字符串来传递--但这是行不通的! 方法希望有一个文件对象作为必要参数。csv.DictReader(f)

单行的解决方案。CSV 到 Dict

我喜欢Python单行线。这就是为什么我写了一本关于这些的🙂

那么,我们能不能在Python的一行中把CSV转换为一个字典列表?

当然,我们可以!

这里的单行代码与之前讨论的代码完成了同样的任务。

import csv; print(*csv.DictReader(open('my_file.csv')), sep='\n')

💡 解释一下。我们导入 模块,使用csv.DictReader() csv 分号 ; 在一行中打包两个语句,在 语句中print 解压 * 输出的所有行,并使用换行符 作为两个字典行之间的'\n' 分隔符

输出结果和以前一样。

{'Name': 'Alice', 'Job': 'Programmer', 'Age': '23', 'Income': '110000'}
{'Name': 'Bob', 'Job': 'Executive', 'Age': '34', 'Income': '90000'}
{'Name': 'Carl', 'Job': 'Sales', 'Age': '45', 'Income': '50000'}

如果你只想把CSV内容存储在字典列表中,而不是打印它们,你可以使用下面的技术。

import csv; lst=[*csv.DictReader(open('my_file.csv'))]; print(lst)

输出是一个字典列表,原始CSV的每一行(非标题)有一个。

[{'Name': 'Alice', 'Job': 'Programmer', 'Age': '23', 'Income': '110000'},  {'Name': 'Bob', 'Job': 'Executive', 'Age': '34', 'Income': '90000'},  {'Name': 'Carl', 'Job': 'Sales', 'Age': '45', 'Income': '50000'}]