Python标准库-CSV 文件操作
Python 的标准函数"csv"提供了操作 CSV 文件的方法,可以针对 CSV 文件进行读取、写入或修改,这篇文章将介绍 csv 常用的方法。
CSV 是什么
CSV 是一种以"逗号分隔值"的文件格式,并以"纯文本形式"存储数据(数字和文字),CSV 是一种通用并相对简单的文件格式,广泛应用于用户、商业和科学领域,因此几乎所有的分析软件和应用程序,都支持 CSV 格式。
下方所呈现的是一个简单的 CSV 文件内容,第一行可以作为普通的内容,也可以是表格的表头:
name,id,color,price
apple,1,red,10
orange,2,orange,15
grap,3,purple,20
watermelon,4,green,30
CSV 常用方法
下方列出几种 csv 模块常用的方法:
方法 | 參數 | 說明 |
---|---|---|
reader() | csvfile | 读取 CSV 文件(序列形式)。 |
writer() | csvfile | 写入 CSV 文件(序列形式)。 |
DictReader() | csvfile | 读取 CSV 文件(字典形式)。 |
DictWriter() | csvfile, fieldnames | 写入 CSV 文件(字典形式)。 |
import csv
要使用 csv 必须先 import csv 模块,或使用 from 的方式,单独 import 特定模块。
import csv
from csv import reader
reader(csvfile)
csv.reader(csvfile) 可以用"序列"的类型,读取 CSV 文件,读取后可以使用序列的操作方式,将每一行(row)打印出来,此外,还可以设定 delimiter 参数,针对"变种 CSV 格式做设置"
import csv
csvfile = open('csv-demo.csv')
r = csv.reader(csvfile) # 读取csv文件
for row in list(r): # 将读取的文件,转换成序列的方式,打印出每个项目
print(row)
# ['name', 'id', 'color', 'price']
# ['apple', '1', 'red', '10']
# ['orange', '2', 'orange', '15']
# ['grape', '3', 'purple', '20']
# ['watermelon', '4', 'green', '30']
writer(csvfile)
csv.writer(csvfile) 可以用"序列"的类型,将数据写入 CSV 文件,写入的方法分为 writerow 单行写入以及 writerows 多行写入两种,下方的例子使用 writerow 写入单行数据。
注意,open 模式使用 a+表示可以读取文件以及写入数据在原本数据的最后方,因此如果 CSV 最后一行不为空,数据会加在最后一行数据后方(在同一行),为了避免这个问题,可以将 CSV 文件增加最后一行,或使用 writerow('')加入一个空行。
import csv
csvfile = open('csv-demo.csv', 'a+') # 使用a+模式打开文件
r = csv.writer(csvfile) # 设置r为写入
r.writerow('') # 如果原本的CSV最后一行row不为空,加入换行
# 如果最后一行为空则不用
r.writerow(['banana',5,'yellow',20]) # 写入单行数据
下方的例子使用 writerows 写入多行数据。
import csv
csvfile = open('csv-demo.csv', 'a+')
write = csv.writer(csvfile)
data = [ # 建立要写入的数据序列
['banana',5,'yellow',20],
['papaya',6,'orange',30]
]
write.writerows(data) # 写入多行数据
DictReader(csvfile)
csv.DictReader(csvfile) 可以用"字典"的类型,读取 CSV 文件,读取后可以使用字典的操作方式,将每一行(row)打印出来,除了 csvfile 为必须填入的参数,还有下列几个非默认的参数(不填入则使用默认值)。
参数 | 说明 |
---|---|
fieldnames | 默认 None,会使用 CSV 的第一行作为字典的键,如果有设置则会以 fieldnames 的内容作为键。 |
restkey | 默认 None,如果有设置,某行多出来的数据会以 restkey 设置值作为键。 |
restval | 默认 None,如果有设置,某行缺少的数据会以 restval 作为值。 |
下方的代码执行后,会读取 CSV 并单独打印出 name、id、color 和 price。
import csv
csvfile = open('csv-demo.csv', 'r') # 打开CSV文件模式为r
data = csv.DictReader(csvfile) # 以字典方式读取数据
for i in data:
print(i['name'],i['id'],i['color'],i['price']) # 分别打印出不同键的值
# apple 1 red 10
# orange 2 orange 15
# grape 3 purple 20
# watermelon 4 green 30
# banana 5 yellow 20
如果 CSV 的第一行不是標題 ( 直接就是資料 ),可透過下方的程式碼,使用 fieldnames 加入鍵 ( 為了明顯區隔,範例裡使用 a、b、c、d ),輸出結果可以看到,字典裡所有資料的鍵,都變成 a、b、c、d。
import csv
csvfile = open('csv-demo.csv', 'r')
keys = ['a','b','c','d'] # 手动设置字典的键
data = csv.DictReader(csvfile, fieldnames=keys) # 设置fieldnames为keys
for i in data:
print(i)
# OrderedDict([('a', 'name'), ('b', 'id'), ('c', 'color'), ('d', 'price')])
# OrderedDict([('a', 'apple'), ('b', '1'), ('c', 'red'), ('d', '10')])
# OrderedDict([('a', 'orange'), ('b', '2'), ('c', 'orange'), ('d', '15')])
# OrderedDict([('a', 'grap'), ('b', '3'), ('c', 'purple'), ('d', '20')])
# OrderedDict([('a', 'watermelon'), ('b', '4'), ('c', 'green'), ('d', '30')])
# OrderedDict([('a', 'banana'), ('b', '5'), ('c', 'yellow'), ('d', '20')])
如果 CSV 的数据有多出来,或有缺漏,可通过下方的代码,使用 restkey 或 restval 来补齐(图片是有多出来以及有缺漏的 CSV 文件),执行后可以看到第四笔数据多了一个 more 的键,最后一行数据缺漏的值都变成 0。
import csv
csvfile = open('csv-demo.csv', 'r')
data = csv.DictReader(csvfile, restkey='more', restval='0')
for i in data:
print(i)
# OrderedDict([('name', 'apple'), ('id', '1'), ('color', 'red'), ('price', '10')])
# OrderedDict([('name', 'orange'), ('id', '2'), ('color', 'orange'), ('price', '15')])
# OrderedDict([('name', 'grap'), ('id', '3'), ('color', 'purple'), ('price', '20')])
# OrderedDict([('name', 'watermelon'), ('id', '4'), ('color', 'green'), ('price', '30'), ('more', ['1234567'])])
# OrderedDict([('name', 'test'), ('id', '0'), ('color', '0'), ('price', '0')])
DictWriter(csvfile, fieldnames)
DictWriter(csvfile, fieldnames) 可以用"字典"的类型,将数据写入 CSV 文件,写入的方法分为 writerow 单行写入以及 writerows 多行写入两种,下方的例子使用 writerow 写入单条数据。
注意,open 模式使用 a+表示可以读取文件以及写入数据在原本数据的最后方,因此如果 CSV 最后一行不为空,数据会加在最后一行数据后方(在同一行),为了避免这个问题,可以将 CSV 文件增加最后一行,或使用 writerow('')加入一个空行。
import csv
fieldnames = ['name','id','color','price'] # 定义要写入数据的键
data = csv.DictWriter(csvfile, fieldnames=fieldnames) # 设置data为写入数据
data.writerow({'name':'papaya','id':5,'color':'orange','price':30}) # 写入数据
下方例子使用 writerows 写入多条数据,多条数据使用“列表 + 字典”的形式表现
import os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks')
fieldnames = ['name','id','color','price'] # 定義要寫入資料的鍵
data = csv.DictWriter(csvfile, fieldnames=fieldnames) # 設定 data 為寫入資料
w = [
{'name':'papaya','id':5,'color':'orange','price':30},
{'name':'banana','id':6,'color':'yellow','price':20}
]
data.writerows(w)
转载自:https://juejin.cn/post/7395471738564706339