CSV 檔案讀取、寫入
## 一、什麼是 CSV 檔案格式?
CSV(Comma-Separated Values,逗號分隔值)是一種用純文字儲存表格資料的檔案格式。
例如以下內容:
```csv
姓名,年齡,城市
王小明,25,台北
李小華,30,高雄
```
其中:
- 每一列代表一筆資料。
- 每一行通常代表一筆記錄。
- 欄位之間通常以逗號 `,` 分隔。
- 第一行常用來表示欄位名稱。
- 如果欄位內容本身包含逗號、換行或雙引號,通常會使用雙引號包住,例如:
```csv
姓名,備註
王小明,"喜歡閱讀, 旅行"
```
CSV 的優點是格式簡單、容易與 Excel、試算表及資料庫交換資料。不過 CSV 本身通常不保存資料型別,例如數字和日期讀取後多半會是字串,需要程式自行轉換。
---
## 二、使用 Python 內建 `csv` 模組讀取 CSV
Python 提供內建的 `csv` 模組,可以方便地讀取不同欄位的資料。
### 實務範例:讀取員工資料並篩選部門
假設有一個 `employees.csv` 檔案:
```csv
姓名,部門,薪資
王小明,資訊部,50000
李小華,行銷部,42000
陳大文,資訊部,55000
```
Python 程式如下:
```python
import csv
with open("employees.csv", mode="r", encoding="utf-8-sig", newline="") as file:
reader = csv.DictReader(file)
for employee in reader:
if employee["部門"] == "資訊部":
salary = int(employee["薪資"])
print(f'{employee["姓名"]} 的薪資是 {salary:,} 元')
```
執行結果:
```text
王小明 的薪資是 50,000 元
陳大文 的薪資是 55,000 元
```
### 說明
- `csv.DictReader` 會將每一列資料讀成字典。
- 第一列的欄位名稱會成為字典的鍵,例如:
```python
{
"姓名": "王小明",
"部門": "資訊部",
"薪資": "50000"
}
```
- CSV 讀出的資料預設都是字串,因此薪資需要透過 `int()` 轉換成整數。
- `encoding="utf-8-sig"` 可以較好地處理由 Excel 建立、包含 UTF-8 BOM 的中文 CSV 檔案。
- `newline=""` 是使用 `csv` 模組時的建議寫法,可避免空白行問題。
---
## 三、使用 Python 內建 `csv` 模組寫入 CSV
可以使用 `csv.DictWriter` 將字典資料寫入 CSV 檔案。
### 實務範例:將銷售資料寫入報表
```python
import csv
sales = [
{"商品": "筆記型電腦", "數量": 2, "單價": 30000},
{"商品": "滑鼠", "數量": 5, "單價": 600},
{"商品": "鍵盤", "數量": 3, "單價": 1200},
]
with open("sales_report.csv", mode="w", encoding="utf-8-sig", newline="") as file:
fieldnames = ["商品", "數量", "單價"]
writer = csv.DictWriter(file, fieldnames=fieldnames)
# 寫入欄位名稱
writer.writeheader()
# 寫入資料
writer.writerows(sales)
print("銷售報表已建立")
```
產生的 `sales_report.csv` 內容如下:
```csv
商品,數量,單價
筆記型電腦,2,30000
滑鼠,5,600
鍵盤,3,1200
```
### 說明
- `fieldnames` 定義 CSV 欄位名稱及順序。
- `writeheader()` 寫入第一列欄位名稱。
- `writerows()` 一次寫入多筆字典資料。
- 使用 `mode="w"` 表示覆寫原有檔案。
- 若希望在原檔案後面追加資料,可使用:
```python
open("sales_report.csv", mode="a", ...)
```
但追加時通常不應再次呼叫 `writeheader()`,否則會重複寫入欄位名稱。
---
## 四、常見的 CSV 操作類別
| 操作 | 使用方式 |
|---|---|
| 逐列讀取資料 | `csv.reader` |
| 以欄位名稱讀取資料 | `csv.DictReader` |
| 逐列寫入資料 | `csv.writer` |
| 以字典方式寫入資料 | `csv.DictWriter` |
如果 CSV 使用的分隔符號不是逗號,例如使用分號,可以指定:
```python
reader = csv.reader(file, delimiter=";")
```
這使得 `csv` 模組也能處理其他類似表格格式的文字檔案。
相關學習地圖、教學課程
Python 資料工程
Python 後端工程、資料庫