# 【Python 筆記】csv 套件使用
[TOC]
感謝您點進本篇文章,我是 LukeTseng,該系列主要以筆記加上口語白話形式學習 Python,若文章某處有誤敬請告知,非常感謝。
## 什麼是 csv
csv 的全名是 comma-separated values,逗號分隔數值。
csv 是一種純文字檔案格式,用逗號來分隔不同的資料欄位,每一行代表一筆記錄,常用於儲存和交換表格資料。
.csv 檔案如同用記事本就能打開的 Excel 表格,因為格式簡單、通用性高,幾乎所有試算表軟體和資料庫都能讀取。
而一般常見的 .csv 格式大概長像下面這樣:
```
name,age,department
John Smith,30,Accounting
Jane Doe,25,IT
```
第一行是標題列(欄位名稱),後面的每一行代表一筆資料記錄。
## Python csv 套件
csv 是 python 早就內建在裡面的一個套件,所以不用特地安裝,只需要在程式碼中打下這一行指令去引入 csv 即可:
```python
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 檔,基本語法如下:
```python
csv.reader(csvfile, dialect='excel', **fmtparams)
```
`csvfile`:csv 的檔案物件。
`dialect`:定義一組參數來控制 CSV 讀取(預設為 excel)。
`**fmtparams`:附加格式參數,如 delimiter、quotechar 等。
範例:
`username-password-recovery-code.csv`:
```
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
```
```python=
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:
```
標題: ['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)。
範例:
```python=
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:
```
{'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()` 相同。
範例:
```python=
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` 檔案,因此他會生成出一個檔案,內容如下:
```
姓名,成績,科系
LukeTseng,100,資工系
陳圈翔,92,電科系
XX,78,資管系
```
### csv.DictWriter()
語法基本上都一樣,就不細講了。
跟 `DictReader()` 相反,這是以字典的形式寫入 csv。
範例:
```python=
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 得到:
```
name,age,major
LukeTseng,18,資工
陳圈翔,19,電科
```
## 總結
csv 套件使用上很簡單,後續可以透過 excel 或是 python 另一個套件 pandas 進行分析處理。
ok 我是 LukeTseng,下次見。
## 參考資料
[Reading CSV files in Python - GeeksforGeeks](https://www.geeksforgeeks.org/pandas/reading-csv-files-in-python/)
[Working with csv files in Python - GeeksforGeeks](https://www.geeksforgeeks.org/python/working-csv-files-python/)
[Writing CSV files in Python - GeeksforGeeks](https://www.geeksforgeeks.org/python/writing-csv-files-in-python/)
[CSV 檔案操作 - Python 教學 | STEAM 教育學習網](https://steam.oxxostudio.tw/category/python/library/csv.html)