首页 > 编程笔记 > Python笔记 阅读:25

Python csv模块读取和写入CSV文件(附带实例)

CSV(Comma-Separated Values)为逗号分隔值,也称字符分隔值,因为分隔字符也可以不是逗号,所以文件以纯文本的形式存储表格数据(数字和文本)。

纯文本意味着文件是一个字符序列,不含二进制数字那样的被解读数据。

CSV 是一种通用的、相对简单的文件格式,最广泛的应用是在程序之间转移表格数据。如果安装了 excel,则会默认用 excel 打开 CSV 文件。

比如,终端设备将采集的环境参数保存为 env.csv 文件,格式为:
env_type, env_value
temperature, 25
humidity, 45
illumination, 1000
第一行代码分别是环境类型和参数值,用逗号隔开,接下来分别是温度 25、湿度 45、光照强度 1000,可以用 excel 打开 env.csv 文件,如下图所示。


图 1 用 excel 打开 env.csv 文件的效果

Python读取CSV文件

Python 提供了 csv 模块读取 CSV 文件,想要读取 env.csv 文件的每一行数据,代码为:
import csv

with open('env.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
        print(row)
运行结果为:
['env_type', 'env_value']
['temperature', '25']
['humidity', '45']
['illumination', '1000']
首先导入 csv 模块,然后通过 open() 函数打开 env.csv 文件,需要确保 env.csv 文件放置在当前目录下,否则 open() 函数中的文件路径需要调整,接着使用 csv 模块的 reader 读取文件,delimiter=','表示分隔符为逗号。

如果要读取 env.csv 文件的所有数据,则代码为:
import csv

with open('env.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
        print(row[0])
        print(row[1])
运行结果为:
env_type
env_value
temperature
25
humidity
45
illumination
1000

可以通过 row[0]、row[1] 下标的方式读取文件中的每一行数据,除此之外,还可以通过第一行数据类型的关键字进行读取,代码为:
import csv
from collections import namedtuple

with open('env.csv') as f:
    f_csv = csv.reader(f)
    headings = next(f_csv)
    Row = namedtuple('Row', headings)
    for r in f_csv:
        row = Row(*r)
        print(row.env_type)
        print(row.env_value)
运行结果为:
temperature
25
humidity
45
illumination
1000

还可以读取 env.csv 文件中的每一列,代码为:
import csv

with open('env.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    list_type = []
    _value = []
    for row in readCSV:
        str_type = row[0]
        str_value = row[1]

        list_type.append(str_type)
        list_value.append(str_value)

print(list_type)
print(list_value)
运行结果为:
['env_type', 'temperature', 'humidity', 'illumination']
['env_value', '25', '45', '1000']

Python写入CSV文件

Python 提供的 csv 模块除了可读取 CSV 文件,还可以写入 CSV 文件。写入文件需要使用 csv 模块的 writer()。

假设有 headers 和 rows 两个列表,即:
headers = ['name', 'age', 'weight']
rows = [('messi', 30, 65), ('xavi', 36, 64), ('iniesta', 33, 62)]

若想将这两个列表中的数据写入 barcelona.csv 文件,可使用下列代码实现,即:
import csv

headers = ['name', 'age', 'weight']
rows = [('messi', 30, 65), ('xavi', 36, 64), ('iniesta', 333, 62)]

with open('barcelona.csv', 'w') as f:
    f_csv = csv.writer(f)
    f_csv.writerow(headers)
    f_csv.writerows(rows)
执行代码之后,会在当前目录下生成 barcelona.csv 文件,打开文件的内容为:
name, age, weight
messi, 30, 65
xavi, 36, 64
iniesta, 333, 62
需要注意的是,headers 只包含一行数据,使用 writerow 写入;rows 包含多行数据,使用 writerows 写入。

除了可以将列表中的数据写入 CSV 文件,还可以将字典中的数据写入 CSV 文件,代码为:
import csv

headers = ['name', 'age', 'weight']
rows = [{'name':'messi', 'age':30, 'weight':65},
         {'name':'xavi', 'age':36, 'weight':64},
         {'name':'iniesta', 'age':33, 'weight':62}]

with open('barcelona.csv', 'w') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()
    f_csv.writerows(rows)
执行代码后,barcelona.csv 文件中的内容与从列表中写入的内容一样。

相关文章