小白學 Python(18):基礎文件操作
- 2019 年 11 月 11 日
- 筆記
人生苦短,我選Python
前文傳送門
絕對路徑和相對路徑
在介紹文件操作之前,我們先介紹兩個概念,絕對路徑和相對路徑。
先百度下看下百度的解釋:
- 絕對路徑:是指目錄下的絕對位置,直接到達目標位置,通常是從盤符開始的路徑。完整的描述文件位置的路徑就是絕對路徑。
- 相對路徑:相對路徑就是指由這個文件所在的路徑引起的跟其它文件(或文件夾)的路徑關係。
不知各位同學看懂了沒,沒看懂我再舉個栗子給各位加深下理解。
絕對路徑
比如我們要描述 Demo.py
的絕對路徑,那麼就是: F:/project/python-learning/base-data-def/Demo.py
。
相對路徑
相對路徑是描述當前位置相對於目標位置的路徑,比如當前我們存在的路徑是 F:/project/python-learning/
,我們還是要描述上面的那個 Demo.py
,那麼它的相對路徑是 ./base-data-def/Demo.py
。
打開文件
Python 為我們提供了打開文件的內置函數 open()
。
常用語法:
open(file, mode='r')
完整語法:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
- file: 必需,文件路徑(相對或者絕對路徑)。
- mode: 可選,文件打開模式
- buffering: 設置緩衝
- encoding: 一般使用 utf-8
- errors: 報錯級別
- newline: 區分換行符
- closefd: 傳入的file參數類型
mode 參數常用值:
模式 | 描述 |
---|---|
t |
文本模式 (默認)。 |
x |
寫模式,新建一個文件,如果該文件已存在則會報錯。 |
b |
二進制模式。 |
+ |
打開一個文件進行更新(可讀可寫)。 |
r |
以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb |
以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。一般用於非文本文件如圖片等。 |
r+ |
打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ |
以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。 |
w |
打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb |
以二進制格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
w+ |
打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb+ |
以二進制格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
a |
打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
ab |
以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
a+ |
打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
ab+ |
以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
光說不練假把式,下面開啟我們第一個示例:
str1 = open('F:/project/python-learning/base-data-def/Demo.py', mode='r').read() print(str1)
打印結果我就不貼出來了,正常打印了我們前幾篇文章的示例代碼。
編碼格式
根據編碼格式的不同,可以將文件分為文本字符和二進制位元組。
我們日常看到的都是文本字符,但是文本字符在保存計算機的時候都會轉變成二進制位元組,這時候,就要考慮到編碼的問題了。
我們看下轉換的示例圖:
值得注意的是,在 Python3 中,文件默認的編碼方式是 UTF-8 ,文本字符的常用的編碼有 ASCII 和 Unicode 。
說了這麼多,還是看一個示例代碼吧:
str2 = '好好學習,天天向上' print(type(str2)) a = str2.encode('utf-8') print(type(a)) print(a.decode('utf-8'))
打印結果如下:
<class 'str'> <class 'bytes'> 好好學習,天天向上
可以看到,我們將字符串 encode()
編碼以後,類型變成了 byte
。
如果我們使用編碼 gbk
的方式解碼上面的 a 會怎麼樣呢?
print(a.decode('gbk'))
結果如下:
Traceback (most recent call last): File "F:/project/python-learning/base-file/Demo.py", line 10, in <module> print(a.decode('gbk')) UnicodeDecodeError: 'gbk' codec can't decode byte 0x8a in position 26: incomplete multibyte sequence
告訴我們不能使用 gbk
來進行解碼操作。
這個其實很好理解,好比我們將中文翻譯成為了英文(編碼),然後我們通過日文翻譯想要將英文翻譯回中文(解碼),那麼這個日文翻譯肯定會罵你腦子有病。
OS 模塊
前面我們介紹了通過內置函數來操作文件,我們還可以通過 OS 模塊更簡單的l哎操作文件。
OS 模塊是和操作系統相關的模塊。
為了演示,先建立一個 test.txt
文件。
首先,我們打開這個文件:
import os os.chdir('F:/project') file = open('test.txt')
讀取這個文件並打印:
print(file.read())
結果如下:
微信公眾號:極客挖掘機
然後我們在下面再加一些內容:
file.write('關注公眾號,好好學習,天天向上')
然後發現執行報錯了:
Traceback (most recent call last): File "F:/project/python-learning/base-file/Demo.py", line 17, in <module> file.write('關注公眾號,好好學習,天天向上') io.UnsupportedOperation: not writable
從報錯信息可以看出,是我們當前讀取權限的問題,因為我們讀取時是只讀權限,無法寫入,所以稍微修改下上面讀取文件的代碼:
import os os.chdir('F:/project') file = open('test.txt', mode='a+') file.write(' n 關注公眾號,好好學習,天天向上')
執行完成後我們再看下我們的測試文件:
寫入成功。
我們測試一個有意思的事情,如果同一個文件我們讀取兩次會怎麼樣?
import os os.chdir('F:/project') file = open('test.txt') print(file.read()) print(file.read())
打印結果如下:
微信公眾號:極客挖掘機 關注公眾號,好好學習,天天向上
我們明明在代碼中打印了兩次,為什麼只顯示了一次呢?
因為 read()
讀取所有內容,讀取完後,游標是指在最後的,再往後讀取肯定就讀不到內容了。
好了,本篇的內容就到此為止了,希望各位同學能動手練習下示例代碼。
示例代碼
本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便大家取用。