python學習中的文件讀寫

文件讀寫

到目前爲止,我們做的一切操作,都是在內存裏進行的。如果一旦斷電或發生意外,那麼你的工作成果將瞬間消失。你有沒有一種人生缺少了點什麼的感覺?是的,我們還缺少將數據在本地文件系統進行持久化的能力,白話講就是文件的讀寫能力。很久以前,我剛開始學習編程的時候,很長一段時間都覺得寫的代碼毫無用處,直到我學會了對本地文件進行讀寫之後,才感覺自己真的能寫點有用的東西了。本節屬於能夠大幅度提升學習激情的章節,至少我是這麼認爲的^_^。

 

Python內置了一個open()方法,用於對文件進行讀寫操作。使用open()方法操作文件就像把大象塞進冰箱一樣,可以分三步走,一是打開文件,二是操作文件,三是關閉文件。

open()方法的返回值是一個file對象,可以將它賦值給一個變量(文件句柄)。其基本語法格式爲:

f = open(filename, mode)

PS:Python中,所有具有read和write方法的對象,都可以歸類爲file類型。而所有的file類型對象都可以使用open方法打開,close方法結束和被with上下文管理器管理。這是Python的設計哲學之一。

filename:一個包含了你要訪問的文件名稱的字符串值,通常是一個文件路徑。

mode:打開文件的模式,有很多種,默認是隻讀方式r。

一個簡單的例子:

# 打開一個文件

f = open("/tmp/foo.txt", "w")

f.write("Python 是一種非常好的語言。\n我喜歡Python!!\n")

# 關閉打開的文件

f.close()

打開模式:

模式

操作

說明

r

只讀

默認模式,如果文件不存在就報錯,存在就正常讀取。

w

只寫

如果文件不存在,新建文件然後寫入;如果存在,先清空文件內容,再寫入。

a

追加

如果文件不存在,新建文件,然後寫入;如果存在,在文件的最後追加寫入。

x

新建

如果文件存在則報錯,如果不存在就新建文件,然後寫入內容,比w模式更安全。

b

二進制模式

比如rb、wb、ab,以bytes類型操作數據

+

讀寫模式

比如r+、w+、a+

一、 b模式:

二進制模式,通常用來讀取圖片、視頻等二進制文件。注意,它在讀寫的時候是以bytes類型讀寫的,因此獲得的是一個bytes對象而不是字符串。在這個讀寫過程中,需要自己指定編碼格式。在使用帶b的模式時一定要注意傳入的數據類型,確保爲bytes類型。

s = 'this is a test'

b = bytes(s,encoding='utf-8')

 

f = open('test.txt','w')

f.write(s)

 

##這樣沒問題,正常寫入了文件。

 

##-------------------------------------------------

s = 'this is a test'

b = bytes(s,encoding='utf-8')

 

f = open('test.txt','wb')    ##注意多了個b

f.write(s)

 

##報錯

TypeError: a bytes-like object is required, not 'str'

##意思是它需要一個bytes類型數據,你卻給了個字符串

 

##---------------------------------------------------

s = 'this is a test'

b = bytes(s,encoding='utf-8')

 

f = open('test.txt','wb')    ##注意多了個b

f.write(b)                        ##將變量b傳給它,b是個bytes類型

二、 + 模式:

對於w+模式,在讀寫之前都會清空文件的內容,建議不要使用!

對於a+模式,永遠只能在文件的末尾寫入,有侷限性,建議不要使用!

對於r+模式,也就是讀寫模式,配合seek()和tell()方法,可以實現更多操作。

三、 編碼問題

要讀取非UTF-8編碼的文件,需要給open()函數傳入encoding參數,例如,讀取GBK編碼的文件:

>>> f = open('gbk.txt', 'r', encoding='gbk')

>>> f.read()

'GBK'

遇到有些編碼不規範的文件,可能會拋出UnicodeDecodeError異常,這表示在文件中可能夾雜了一些非法編碼的字符。遇到這種情況,可以提供errors參數,表示如果遇到編碼錯誤後如何處理。

>>> f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')

四、 文件對象操作

每當我們用open方法打開一個文件時,將返回一個文件對象。這個對象內置了很多操作方法。下面假設,已經打開了一個f文件對象。

1. f.read(size)

讀取一定大小的數據, 然後作爲字符串或字節對象返回。size是一個可選的數字類型的參數,用於指定讀取的數據量。當size被忽略了或者爲負值,那麼該文件的所有內容都將被讀取並且返回。

f = open("1.txt", "r")

 

str = f.read()

print(str)

 

f.close()

如果文件體積較大,請不要使用read()方法一次性讀入內存,而是read(512)這種一點一點的讀。

2. f.readline()

從文件中讀取一行n內容。換行符爲'\n'。如果返回一個空字符串,說明已經已經讀取到最後一行。這種方法,通常是讀一行,處理一行,並且不能回頭,只能前進,讀過的行不能再讀了。

f = open("1.txt", "r")

str = f.readline()

print(str)

f.close()

3. f.readlines()

將文件中所有的行,一行一行全部讀入一個列表內,按順序一個一個作爲列表的元素,並返回這個列表。readlines方法會一次性將文件全部讀入內存,所以也存在一定的風險。但是它有個好處,每行都保存在列表裏,可以隨意存取。

f = open("1.txt", "r")

a = f.readlines()

print(a)

f.close()

4. 遍歷文件

實際上,更多的時候,我們將文件對象作爲一個迭代器來使用。

# 打開一個文件

f = open("1.txt", "r")

 

for line in f:

    print(line, end='')

 

# 關閉打開的文件

f.close()

這個方法很簡單, 不需要將文件一次性讀出,但是同樣沒有提供一個很好的控制,與readline方法一樣只能前進,不能回退。

幾種不同的讀取和遍歷文件的方法比較:如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反覆調用read(size)比較保險;如果是配置文件,調用readlines()最方便。普通情況,使用for循環更好,速度更快。

5. f.write()

將字符串或bytes類型的數據寫入文件內。write()動作可以多次重複進行,其實都是在內存中的操作,並不會立刻寫回硬盤,直到執行close()方法後,纔會將所有的寫入操作反映到硬盤上。在這過程中,如果想將內存中的修改,立刻保存到硬盤上,可以使用f.flush()方法,但這可能造成數據的不一致。

# 打開一個文件

f = open("/tmp/foo.txt", "w")

 

f.write("Python 是一種非常好的語言。\n我喜歡Python!!\n")

 

# 關閉打開的文件

f.close()

6. f.tell()

返回文件讀寫指針當前所處的位置,它是從文件開頭開始算起的字節數。一定要注意了,是字節數,不是字符數。

7. f.seek()

如果要改變位置指針的位置, 可以使用f.seek(offset, from_what)方法。seek()經常和tell()方法配合使用。

from_what的值,如果是0表示從文件開頭計算,如果是1表示從文件讀寫指針的當前位置開始計算,2表示從文件的結尾開始計算,默認爲0,例如:

offset:表示偏移量。

  • seek(x,0) : 從起始位置即文件首行首字符開始移動 x 個字符
  • seek(x,1) : 表示從當前位置往後移動x個字符
  • seek(-x,2):表示從文件的結尾往前移動x個字符

看一個例子:

>>> f = open("d:\\1.txt", "rb+")

>>> f.write(b"1232312adsfalafds")

17

>>> f.tell()

17

>>> f.seek(5)

5

>>> f.read(1)

b'1'

>>> f.seek(-3, 2)

14

>>> f.read(1)

b'f'

8. f.close()

關閉文件對象。當處理完一個文件後,調用f.close()來關閉文件並釋放系統的資源。文件關閉後,如果嘗試再次調用該文件對象,則會拋出異常。忘記調用close()的後果是數據可能只寫了一部分到磁盤,剩下的丟失了,或者更糟糕的結果。也就是說大象塞進冰箱後,一定不要忘記關上冰箱的門。

五、 with關鍵字

with關鍵字用於Python的上下文管理器機制。爲了防止諸如open這一類文件打開方法在操作過程出現異常或錯誤,或者最後忘了執行close方法,文件非正常關閉等可能導致文件泄露、破壞的問題。Python提供了with這個上下文管理器機制,保證文件會被正常關閉。在它的管理下,不需要再寫close語句。注意縮進。

with open('test.txt', 'w') as f:

    f.write('Hello, world!')

with支持同時打開多個文件:

with open('log1') as obj1, open('log2','w') as obj2:

    s=obj1.read()

    obj2.write(s)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章