CSV 文件操作
Python 的标准函数“csv”提供了操作 CSV 文件的方法,可以针对 CSV 文件进行读取、写入或修改,这篇教学将会介绍 csv 常用的方法。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab,但 Colab 实作 CSV 效能较差,建议使用本机环境测试。
CSV 文件操作时,需要使用 open() 打开,详细信息可以参考:内建函数 ( 文件读写 open )。
本篇教学可使用 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 模组常用的方法 ( 参考 Python 官方文件: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 os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
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']
# ['grap', '3', 'purple', '20']
# ['watermelon', '4', 'green', '30']
writer(csvfile)
csv.writer(csvfile) 可以用“串列”的型态,将数据写入 CSV 文件,写入的方法分成 writerow 单行写入以及 writerows 多行写入两种,下方的例子使用 writerow 写入单行数据。
注意,open 模式使用 a+ 表示可以读取文件以及写入数据在原本数据的最后方,因此如果 CSV 最后一行不为空,数据会加在最后一笔数据后方 ( 在同一行 ),为了避免这个问题,可以将 CSV 文件增加最后一行,或使用 writerow('') 加入一个空行。
import os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
csvfile = open('csv-demo.csv', 'a+') # 使用 a+ 模式開啟檔案
r = csv.writer(csvfile) # 設定 r 為寫入
r.writerow('') # 如果原本的 CSV 最後一行 row 不為空,加入換行
# 如果最後一行為空則不用
r.writerow(['banana',5,'yellow',20]) # 寫入單行資料
下方的例子使用 writerows 写入多行数据。
import os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
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 os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
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
# grap 3 purple 20
# watermelon 4 green 30
# banana 5 yellow 20
如果 CSV 的第一行不是标题 ( 直接就是数据 ),可透过下方的程序码,使用 fieldnames 加入键 ( 为了明显区隔,范例里使用 a、b、c、d ),输出结果可以看到,字典里所有数据的键,都变成 a、b、c、d。
import os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks')
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 os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks')
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 os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks')
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)
微信扫码关注
抖音扫码关注