【Python 筆記】csv 套件使用

感謝您點進本篇文章,我是 LukeTseng,該系列主要以筆記加上口語白話形式學習 Python,若文章某處有誤敬請告知,非常感謝。

什麼是 csv

csv 的全名是 comma-separated values,逗號分隔數值。

csv 是一種純文字檔案格式,用逗號來分隔不同的資料欄位,每一行代表一筆記錄,常用於儲存和交換表格資料。

.csv 檔案如同用記事本就能打開的 Excel 表格,因為格式簡單、通用性高,幾乎所有試算表軟體和資料庫都能讀取。

而一般常見的 .csv 格式大概長像下面這樣:

1
2
3
name,age,department
John Smith,30,Accounting
Jane Doe,25,IT

第一行是標題列(欄位名稱),後面的每一行代表一筆資料記錄。

Python csv 套件

csv 是 python 早就內建在裡面的一個套件,所以不用特地安裝,只需要在程式碼中打下這一行指令去引入 csv 即可:

1
2
import csv
# 或是 from csv import *

在做 csv 檔案操作的時候,需要應用到檔案處理的觀念,因此常常需要使用到 open() 函式開啟檔案。

之後範例均取自網站 Staffbase 中的 CSV 範例檔:https://support.staffbase.com/hc/en-us/articles/360007108391-CSV-File-Examples

讀入 csv 檔案

csv.reader()

使用 csv.reader() 方法做讀取動作,能夠逐行讀取 csv 檔,基本語法如下:

1
csv.reader(csvfile, dialect='excel', **fmtparams)

csvfile:csv 的檔案物件。

dialect:定義一組參數來控制 CSV 讀取(預設為 excel)。

**fmtparams:附加格式參數,如 delimiter、quotechar 等。

範例:

username-password-recovery-code.csv

1
2
3
4
5
6
Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location
booker12;9012;12se74;rb9012;Rachel;Booker;Sales;Manchester
grey07;2070;04ap67;lg2070;Laura;Grey;Depot;London
johnson81;4081;30no86;cj4081;Craig;Johnson;Depot;London
jenkins46;9346;14ju73;mj9346;Mary;Jenkins;Engineering;Manchester
smith79;5079;09ja61;js5079;Jamie;Smith;Engineering;Manchester
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import csv

# 讀取 CSV 檔案
with open('username-password-recovery-code.csv', 'r', encoding='utf-8') as file:
# 使用分號作為分隔符號
csv_reader = csv.reader(file, delimiter=';')

# 讀取標題行
headers = next(csv_reader)
print("標題:", headers)
print("-" * 50)

# 逐行讀取資料
for row in csv_reader:
username = row[0]
identifier = row[1]
first_name = row[4]
last_name = row[5]
department = row[6]
location = row[7]

print(f"{first_name} {last_name} - {department} ({location})")

Output:

1
2
3
4
5
6
7
標題: ['Username', ' Identifier', 'One-time password', 'Recovery code', 'First name', 'Last name', 'Department', 'Location']
--------------------------------------------------
Rachel Booker - Sales (Manchester)
Laura Grey - Depot (London)
Craig Johnson - Depot (London)
Mary Jenkins - Engineering (Manchester)
Jamie Smith - Engineering (Manchester)

next() 函數是 Python 內建函數,用來從迭代器(iterator)中取得下一個元素。可以把 csv 看成是一串一串的串列所組成,標題是一整個串列,而在一開始就先讀掉標題行的話,那之後讀取就不會再讀到標題行了,而是直接單刀直入看數據的部分。

csv.DictReader()

語法同 csv.reader(),只是回傳的型態變成字典(Dict)。

範例:

1
2
3
4
5
import csv
with open('username-password-recovery-code.csv', mode ='r') as file:
csv_DictReader = csv.DictReader(file)
for lines in csv_DictReader:
print(lines)

Output:

1
2
3
4
5
{'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'booker12;9012;12se74;rb9012;Rachel;Booker;Sales;Manchester'}
{'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'grey07;2070;04ap67;lg2070;Laura;Grey;Depot;London'}
{'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'johnson81;4081;30no86;cj4081;Craig;Johnson;Depot;London'}
{'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'jenkins46;9346;14ju73;mj9346;Mary;Jenkins;Engineering;Manchester'}
{'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'smith79;5079;09ja61;js5079;Jamie;Smith;Engineering;Manchester'}

寫入 csv 檔案

csv.writer()

使用 csv.writer() 做寫入動作。

語法與 csv.reader() 相同。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
import csv

students = [
['姓名', '成績', '科系'],
['LukeTseng', 100, '資工系'],
['陳圈翔', 92, '電科系'],
['XX', 78, '資管系']
]

with open('grades.csv', 'w', encoding='utf-8', newline='') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(students) # 一次寫入多行

由於我這邊沒有已存在的 grades.csv 檔案,因此他會生成出一個檔案,內容如下:

1
2
3
4
姓名,成績,科系
LukeTseng,100,資工系
陳圈翔,92,電科系
XX,78,資管系

csv.DictWriter()

語法基本上都一樣,就不細講了。

DictReader() 相反,這是以字典的形式寫入 csv。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import csv

# 寫入字典
students = [
{'name': 'LukeTseng', 'age': 18, 'major': '資工'},
{'name': '陳圈翔', 'age': 19, 'major': '電科'}
]

with open('output.csv', 'w', encoding='utf-8', newline='') as file:
fieldnames = ['name', 'age', 'major']
writer = csv.DictWriter(file, fieldnames=fieldnames)

writer.writeheader() # 寫入標題列
writer.writerows(students) # 寫入資料

輸出的 output.csv 得到:

1
2
3
name,age,major
LukeTseng,18,資工
陳圈翔,19,電科

總結

csv 套件使用上很簡單,後續可以透過 excel 或是 python 另一個套件 pandas 進行分析處理。

ok 我是 LukeTseng,下次見。

參考資料

Reading CSV files in Python - GeeksforGeeks

Working with csv files in Python - GeeksforGeeks

Writing CSV files in Python - GeeksforGeeks

CSV 檔案操作 - Python 教學 | STEAM 教育學習網