---
# System prepended metadata

title: 【Python 筆記】檔案處理（File handling）
tags: [python, Python, 字串處理, 程式語言]

---

# 【Python 筆記】檔案處理（File handling）

[TOC]

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

## 簡介

檔案處理是程式人必備的技能，主要是因為它能讓資料持久化，讓資訊存留在硬碟上，而非程式執行期間的記憶體中。也可以方便讀取或寫入資料檔，如設定檔、日誌（log）、或用戶資料。最重要的是自動化流程，例如可結合 .csv 套件將讀入的檔案寫入 .csv 中產生報表等等。

基本概念如下：

- 開檔（open）：使用 `open()` 函數打開檔案。
- 讀寫（read / write）：對檔案內容進行操作。
- 關檔（close）：確保所有操作完成並釋放系統資源。

## open() 方法

使用 `open()` 之後，若沒有後續動作要執行，務必一定要搭配 `close()` 方法關閉檔案，不然你讓檔案一直在那邊開著浪費記憶體。

`open()` 基本語法：

```python
open(file, mode='r')
```

open 基本上是接收兩個參數，`file` 是檔名，而 mode 則是模式，可選擇讀（r）還是寫（w）。

而實際上 open 有很多參數可以調整，上述只是最基本的兩項：

```python
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
```

- buffering：設定緩衝區。
- encoding：設定編碼，如 utf-8、utf-16。
- errors：錯誤等級。
- newline：換行。
- closefd：傳入的 file 參數型態。

### 檔案開啟模式

| 模式 | 說明 |
| :-- | :-- |
| `r` | 讀取模式（預設）。若檔案不存在會報錯。 |
| `w` | 寫入模式。若檔案存在，會先清空內容。 |
| `a` | 附加模式。將內容寫到檔案末尾。 |
| `b` | 二進位模式，用於非文字檔案。 |
| `r+` | 同時讀與寫。檔案需存在。 |
| `w+` | 讀寫模式但會清空原檔案。 |
| `a+` | 讀寫模式但寫入追加在尾端。 |

### 範例

目錄架構有兩個檔案：`example.txt`、`main.py`，今天想要用 python 將 `example.txt` 的內容讀取並印出，可寫以下程式碼：

```python=
f = open('example.txt', 'r')   # 打開檔案以讀取模式
content = f.read()             # 讀取內容
print(content)
f.close()                      # 關閉檔案
```

`example.txt` 的內容如下：

```
Hello World! I like Python.
```

此程式會先開啟檔案、讀取，輸出內容，最後關閉檔案。

### 使用 with 敘述讀取檔案

with 是 Python 的一種資源管理器（Context manager），用來管理資源的取得與釋放。

它的主要用途是讓你在進入 block 的時候自動取得資源（如檔案），並在離開 block 時自動釋放資源，不論 block 內是否發生錯誤。

所以使用 with 的好處是 Python 都幫你做好資源管理了，也不用手動加上 `close()`。

基本語法如下：

```python
with obj as variable:
    # 程式碼區塊 : block
    xx = f.read()
    print(xx)
# block 結束後，資源自動釋放
```

沿用上節範例：

```python=
with open('example.txt', 'r') as f:
    content = f.read()
    print(content)
```

同樣可讀取到 `Hello World! I like Python.`。

## 讀資料的方法

### read()

讀取整個檔案的內容。

語法：

```python
fileObject.read([size]); 
```

fileObject 為檔案物件，而 `size` 為從 fileObject 中讀取的字元數，`size` 預設為 -1，表示讀取 fileObject 的整個內容。

以下是 `example.txt` 的內容：

```
Hello Python!
No C plus plus, I wanna Python.
ummmmm...... but Python's runtime speed is so slow.
```

範例：

```python=
with open('example.txt', 'r') as f:
    line = f.read(9)
    print(line)
```

Output：

```
Hello Pyt
```

### readline()

一次讀一行。

語法：

```python
fileObject.readline();
```

`example.txt` 內容：

```
Hello Python!
No C plus plus, I wanna Python.
ummmmm...... but Python's runtime speed is so slow.
abcabc
123123
456456
```

範例：

```python=
with open('example.txt', 'r') as f:
    line1 = f.readline()
    line2 = f.readline()
print(line1, line2, sep="")
```

### readlines()

讀取所有行並回傳成一個 list，碰到 EOF 會回傳空字串。

語法同 `readline()`。

`example.txt` 內容同上個範例。

範例：

```python=
with open('example.txt', 'r') as f:
    for line in f.readlines():
        line = line.strip() # 移除字串間的空格用
        print(line)
```

## 寫入檔案

### write()

語法：

```python
fileObject.write( [ str ])
```

str：要寫入檔案的字串。

範例：

```python=
with open('example.txt', 'w') as f:
    f.write('Hello Python!\n')
    f.write('File handling is important.')
```

使用 `'w'` 模式會覆蓋掉檔案中所有內容。

執行後的 `example.txt`：

```
Hello Python!
File handling is important.
```

### writelines()

語法同 `write()`，只是在參數部分替換成字串列表或可迭代物件。

範例：

```python=
lines = ['Python\n', 'File\n', 'Handling\n']
with open('output.txt', 'w') as f:
    f.writelines(lines)
```

執行後若沒有 `output.txt` 檔案則會自動生成，然後寫入三個字串：

```
Python
File
Handling

```

## 總整理

檔案處理是讓資料永久保存於硬碟（而非記憶體），常用於設定檔（config）、日誌（log）、自動化報表等。主要步驟包含：

- **開檔 (`open`)**：用 `open()` 打開檔案來準備讀/寫操作。
- **讀寫操作 (`read`/`write`)**：存取檔案內容。
- **關檔 (`close`)**：釋放系統資源，避免資源損耗。

### open 方法與模式

**基本語法**

```python
open(file, mode='r')
```

- `file`：檔案名稱
- `mode`：開檔模式（預設為 `'r'` 讀取）

**常用模式**


| 模式 | 功能說明 |
| :-- | :-- |
| `r` | 讀取（檔案需存在） |
| `w` | 寫入（會清空原內容或新建檔案） |
| `a` | 附加寫入（資料加在尾端） |
| `b` | 二進位模式（適合非文字檔） |
| `r+` | 讀寫（檔案需存在） |
| `w+` | 讀寫並清空檔案 |
| `a+` | 讀寫並追加在尾端 |

**開檔後務必記得關檔**，否則會浪費資源：

```python
f = open('example.txt', 'r')
content = f.read()
print(content)
f.close()
```

### 用 with 管理資源

用 `with` 區塊能自動管理開關檔案，不必手動 `close()`。

```python
with open('example.txt', 'r') as f:
    content = f.read()
    print(content)
# 出了區塊自動關檔
```

### read(size) 讀取指定字元數

```python
with open('example.txt', 'r') as f:
    data = f.read(9)
    print(data)  # 只印出前9個字元
```


### readline() 讀取一行

```python
with open('example.txt', 'r') as f:
    line1 = f.readline()
    line2 = f.readline()
    print(line1 + line2)  # 連印兩行
```


### readlines() 讀取所有行，回傳 list

```python
with open('example.txt', 'r') as f:
    for line in f.readlines():
        print(line.strip())  # 去除行尾空白與換行
```

### write(str) 寫入文字

```python
with open('example.txt', 'w') as f:
    f.write('Hello Python!\n')
    f.write('File handling is important.')
# 會覆蓋原檔案內容
```

### writelines(list) 寫入多行文字

```python
lines = ['Python\n', 'File\n', 'Handling\n']
with open('output.txt', 'w') as f:
    f.writelines(lines)
# 沒有檔案會自動生成
```

## 參考資料

[Python 寫檔，寫入 txt 文字檔 | ShengYu Talk](https://shengyu7697.github.io/python-write-text-file/)

[檔案操作 os - Python 教學 | STEAM 教育學習網](https://steam.oxxostudio.tw/category/python/library/os.html)

[Python 檔案處理：開啟、讀取、寫入與關閉 - iT 邦幫忙::一起幫忙解決難題，拯救 IT 人的一天](https://ithelp.ithome.com.tw/articles/10368695)

[Python3 File 方法 | 菜鸟教程](https://www.runoob.com/python3/python3-file-methods.html)