文件
目標
文件的概念 文件的基本操作 文件/文件夾的常用操作 文本文件的編碼方式
01. 文件的概念
1.1 文件的概念和作用
計算機的 文件,就是存儲在某種 長期儲存設備 上的一段 數據
長期存儲設備包括:硬碟、U 盤、移動硬碟、光碟...
文件的作用
將數據長期保存下來,在需要的時候使用
CPU
內存
硬碟
1.2 文件的存儲方式
在計算機中,文件是以 二進位 的方式保存在磁碟上的
文本文件和二進位文件
文本文件
可以使用 文本編輯軟體 查看
本質上還是二進位文件
例如:python 的源程序
二進位文件
保存的內容 不是給人直接閱讀的,而是 提供給其他軟體使用的
例如:圖片文件、音頻文件、視頻文件等等
二進位文件不能使用 文本編輯軟體 查看
02. 文件的基本操作
2.1 操作文件的套路
在 計算機 中要操作文件的套路非常固定,一共包含三個步驟:
1. 打開文件
2. 讀、寫文件
讀 將文件內容讀入內存
寫 將內存內容寫入文件
3. 關閉文件
2.2 操作文件的函數/方法
在 `Python` 中要操作文件需要記住 1 個函數和 3 個方法
| 序號 | 函數/方法 | 說明 |
| --- | --- | --- |
| 01 | open | 打開文件,並且返回文件操作對象 |
| 02 | read | 將文件內容讀取到內存 |
| 03 | write | 將指定內容寫入文件 |
| 04 | close | 關閉文件 |
`open` 函數負責打開文件,並且返回文件對象
`read`/`write`/`close` 三個方法都需要通過 文件對象 來調用
2.3 read 方法 —— 讀取文件
`open` 函數的第一個參數是要打開的文件名(文件名區分大小寫)
如果文件 存在,返回 文件操作對象
如果文件 不存在,會 拋出異常
`read` 方法可以一次性 讀入 並 返回 文件的 所有內容
`close` 方法負責 關閉文件
如果 忘記關閉文件,會造成系統資源消耗,而且會影響到後續對文件的訪問
注意:`read` 方法執行後,會把 文件指針 移動到 文件的末尾
```python
1. 打開 - 文件名需要注意大小寫
file = open("README")
2. 讀取
text = file.read()
print(text)
3. 關閉
file.close()
提示
在開發中,通常會先編寫 打開 和 關閉 的代碼,再編寫中間針對文件的 讀/寫 操作
文件指針(知道)
文件指針 標記 從哪個位置開始讀取數據
第一次打開 文件時,通常 文件指針會指向文件的開始位置
當執行了 `read` 方法後,文件指針 會移動到 讀取內容的末尾
默認情況下會移動到 文件末尾
思考
如果執行了一次 `read` 方法,讀取了所有內容,那麼再次調用 `read` 方法,還能夠獲得到內容嗎?
答案
不能
第一次讀取之後,文件指針移動到了文件末尾,再次調用不會讀取到任何的內容
2.4 打開文件的方式
`open` 函數默認以 只讀方式 打開文件,並且返回文件對象
語法如下:
```python
f = open("文件名", "訪問方式")
| 訪問方式 | 說明 |
| :---: | --- |
| r | 以只讀方式打開文件。文件的指針將會放在文件的開頭,這是默認模式。如果文件不存在,拋出異常 |
| w | 以只寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件 |
| a | 以追加方式打開文件。如果該文件已存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入 |
| r+ | 以讀寫方式打開文件。文件的指針將會放在文件的開頭。如果文件不存在,拋出異常 |
| w+ | 以讀寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件 |
| a+ | 以讀寫方式打開文件。如果該文件已存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入 |
提示
頻繁的移動文件指針,會影響文件的讀寫效率,開發中更多的時候會以 只讀、只寫 的方式來操作文件
寫入文件示例
```python
打開文件
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天氣真好")
關閉文件
f.close()
2.5 按行讀取文件內容
`read` 方法默認會把文件的 所有內容 一次性讀取到內存
如果文件太大,對內存的佔用會非常嚴重
`readline` 方法
`readline` 方法可以一次讀取一行內容
方法執行後,會把 文件指針 移動到下一行,準備再次讀取
讀取大文件的正確姿勢
```python
打開文件
file = open("README")
while True:
讀取一行內容
text = file.readline()
判斷是否讀到內容
if not text:
break
每讀取一行的末尾已經有了一個 `\n`
print(text, end="")
關閉文件
file.close()
2.6 文件讀寫案例 —— 複製文件
目標
用代碼的方式,來實現文件複製過程
小文件複製
打開一個已有文件,讀取完整內容,並寫入到另外一個文件
```python
1. 打開文件
file_read = open("README")
file_write = open("README[復件]", "w")
2. 讀取並寫入文件
text = file_read.read()
file_write.write(text)
3. 關閉文件
file_read.close()
file_write.close()
大文件複製
打開一個已有文件,逐行讀取內容,並順序寫入到另外一個文件
```python
1. 打開文件
file_read = open("README")
file_write = open("README[復件]", "w")
2. 讀取並寫入文件
while True:
每次讀取一行
text = file_read.readline()
判斷是否讀取到內容
if not text:
break
file_write.write(text)
3. 關閉文件
file_read.close()
file_write.close()
```
03. 文件/目錄的常用管理操作
在 終端 / 文件瀏覽器、 中可以執行常規的 文件 / 目錄 管理操作,例如:
創建、重命名、刪除、改變路徑、查看目錄內容、……
在 `Python` 中,如果希望通過程序實現上述功能,需要導入 `os` 模塊
文件操作
| 序號 | 方法名 | 說明 | 示例 |
| --- | --- | --- | --- |
| 01 | rename | 重命名文件 | `os.rename(源文件名, 目標文件名)` |
| 02 | remove | 刪除文件 | `os.remove(文件名)` |
目錄操作
| 序號 | 方法名 | 說明 | 示例 |
| --- | --- | --- | --- |
| 01 | listdir | 目錄列表 | `os.listdir(目錄名)` |
| 02 | mkdir | 創建目錄 | `os.mkdir(目錄名)` |
| 03 | rmdir | 刪除目錄 | `os.rmdir(目錄名)` |
| 04 | getcwd | 獲取當前目錄 | `os.getcwd()` |
| 05 | chdir | 修改工作目錄 | `os.chdir(目標目錄)` |
| 06 | path.isdir | 判斷是否是文件 | `os.path.isdir(文件路徑)`
> 提示:文件或者目錄操作都支持 相對路徑 和 絕對路徑
04. 文本文件的編碼格式(科普)
文本文件存儲的內容是基於 字符編碼 的文件,常見的編碼有 `ASCII` 編碼,`UNICODE` 編碼等
> Python 2.x 默認使用 `ASCII` 編碼格式
> Python 3.x 默認使用 `UTF-8` 編碼格式
4.1 ASCII 編碼和 UNICODE 編碼
`ASCII` 編碼
計算機中只有 `256` 個 `ASCII` 字符
一個 `ASCII` 在內存中佔用 1 個字節 的空間
`8` 個 `0/1` 的排列組合方式一共有 `256` 種,也就是 `2 8`
`UTF-8` 編碼格式
計算機中使用 1~6 個字節 來表示一個 `UTF-8` 字符,涵蓋了 地球上幾乎所有地區的文字
大多數漢字會使用 3 個字節 表示
`UTF-8` 是 `UNICODE` 編碼的一種編碼格式
4.2 Ptyhon 2.x 中如何使用中文
> Python 2.x 默認使用 `ASCII` 編碼格式
> Python 3.x 默認使用 `UTF-8` 編碼格式
在 Python 2.x 文件的 第一行 增加以下代碼,解釋器會以 `utf-8` 編碼來處理 python 文件
```python
- coding:utf8 -
> 這方式是官方推薦使用的!
也可以使用
```python
coding=utf8
unicode 字符串
在 `Python 2.x` 中,即使指定了文件使用 `UTF-8` 的編碼格式,但是在遍歷字符串時,仍然會 以字節為單位遍歷 字符串
要能夠 正確的遍歷字符串,在定義字符串時,需要 在字符串的引號前,增加一個小寫字母 `u`,告訴解釋器這是一個 `unicode` 字符串(使用 `UTF-8` 編碼格式的字符串)
```python
- coding:utf8 -
在字符串前,增加一個 `u` 表示這個字符串是一個 utf8 字符串
hello_str = u"你好世界"
print(hello_str)
for c in hello_str:
print(c)