在Python中,文件操作使用函數open(文件,模式,編碼方式)
一、文件操作的模式
在Python中,操作文件主要有以下四種模式
1、r:只讀模式
f = open("test.txt", "r") data = f.read() print(data)
2、w:只寫模式 要注意的是,在用這種模式打開文件的時候,如果文件不存在,會先創建一個文件;如果文件存在,則會先將裏面的內容清空。
f = open("demo.txt", "w") f.write("Hello Python!!!") f.close()
3、x:只寫模式 這種模式跟w模式基本是一樣的,只是如果要操作的文件已經存在,則會報錯。
f = open("demo.txt", "x") f.write("Hello Python!!!") f.close()
如上面的代碼所示,在demo.txt文件已經存在的情況下,會出現下面的錯誤。
Traceback (most recent call last):
File "/Users/ssspure/PycharmProjects/File/BaseFile/FileMode.py", line 7, in <module>
f = open("demo.txt", "x")
FileExistsError: [Errno 17] File exists: 'demo.txt'
4、a:追加模式 這種模式不能進行讀的操作,只能在在原來內容的基礎上追加內容,如果文件不存在的話,也會先創建文件,然後再進行寫操作。
f = open("demo1.txt", "a") print(f.tell()) f.write("Hello Python!!!") f.close()
通過tell()方法可以看出,在文件打開的時候,指針已經移動到了文件的末尾,所以在使用write()寫入內容的時候,都會在文件的末尾追加新的內容。
二、二進制方式讀寫文件
在上面介紹的文件操作中,全都是以文本方式來讀寫文件,也就是寫入的和讀出的都是文本,下面介紹以字節(二進制)的方式讀寫文件
以字節方式讀寫文件,也就是在原來操作模式的基礎上加上字節模式,即:
rb,wb,xb,ab
先介紹一下以普通方式讀寫文件的流程
f = open("test.txt", "r", encoding="utf-8")
數據在磁盤上以二進制的方式存儲,當我們以r的方式讀取文件的時候,Python內部先將文件的二進制數據讀取出來,然後以我們制定的編碼方式,將二進制數據轉換成文本數據。
在寫入的時候也是一樣
f = open("demo1.txt", "w", encoding="utf-8") f.write("Hello Python!!!")
我們傳入的都是文本數據,Python先根據編碼方式,將文本數據轉換成二進制數據,然後存儲到磁盤
*可能在平時我們讀寫的時候都不會制定編碼方式,這是因爲Python內部默認的編碼方式就是UTF-8
所以當我們通過字節方式讀寫文件的時候,Python讀取病返回給我們的就直接是二進制數據,同樣,在寫入的時候,我們也應該傳給Python字節數據。
字節方式讀取文件
f = open("demo.txt", "rb") data = f.read() print(type(data), data) data = str(data, encoding="utf-8") print(type(data), data)
上面代碼輸出的結果是:
<class 'bytes'> b'Hello Python!!!'
<class 'str'> Hello Python!!!
從打印結果可以看出,直接通過rb方式讀取出來的是字節格式的數據,可以通過str()方法將其轉換成字符數據。
需要注意的一點是:在以字節方式讀取文件的時候,不能加上編碼方式,否則將會報錯
f = open("demo.txt", "rb", encoding="utf-8") data = f.read() print(type(data), data)
Traceback (most recent call last):
File "/Users/ssspure/PycharmProjects/File/BaseFile/FileMode.py", line 16, in <module>
f = open("demo.txt", "rb", encoding="utf-8")
ValueError: binary mode doesn't take an encoding argument
執行代碼將會出現上面的錯誤,這是因爲通過字節方式讀取數據的時候,已經不需要Python幫我們將二進制數據轉換成字符數據了。
字節方式寫入文件
f = open("demo.txt", "wb") f.write(bytes("Hello World!!!", encoding="utf-8")) f.close()
通過字節方式寫入文件的時候,傳給Python的必須是字節數據,否則就會報錯,如下代碼所示
f = open("demo.txt", "wb") f.write("Hello World!!!") f.close()
Traceback (most recent call last):
File "/Users/ssspure/PycharmProjects/File/BaseFile/FileMode.py", line 23, in <module>
f.write("Hello World!!!")
TypeError: a bytes-like object is required, not 'str'
所以在使用字節方式讀寫文件的時候,應該注意編碼方式和輸出傳入數據的格式。
三、文件操作的相關方法
1、flush()
將暫時保存在內存中的數據寫到硬盤上
2、seek()
將指針移動到指定的位置
3、tell()
顯示當前指針所在的位置
4、readline()
一次只讀取文件中的一行數據
5、truncate()
保留當前指針之前的數據,刪除指針所在位置之後的數據