如何正確讀寫檔案

2022-01-30 16:01:28 字數 2476 閱讀 2736

看題:請指出下面**段中的錯誤

f = open("test.txt", mode="w")

f.write(u"python之禪")

分析:python 提供了內建函式 open 用於讀寫檔案,函式返回乙個檔案物件,可對檔案進行讀、寫操作,用引數 mode 來控制。

引數 說明

r 讀檔案(預設)

w 寫檔案 (如果檔案中有內容,已有的內容將被覆蓋)

a 寫檔案(如果檔案中有內容,新內容追後到檔案後面)

預設是讀檔案

f = open("test.txt")

f.read()

python之禪

上面這段**如果在python2中執行,會報錯:

traceback (most recent call last):

file 「「, line 1, in

unicodeencodeerror: 『ascii』 codec can』t encode characters in position 6-7: ordinal not in range(128)

之所以報錯是程式沒法直接儲存 unicode 字串,要經過編碼轉換成而 str 型別的二進位制位元組序列才能夠儲存。

write 方法會自動幫你做編碼轉換,預設使用 ascii 編碼格式,因為 ascii 字符集不能處理中文,所以出現了 unicodeencodeerror 錯誤。

正確的方式是在呼叫 write 之前手動用 utf-8 或者 gbk 編碼轉換成 str 型別。

f = open("test.txt", mode="w")

content = u"python之禪"

content = content.encode(encoding='utf-8')

f.write(content)

第二個問題是檔案物件沒有正常關閉,有人可能要問了,不關閉會有什麼影響,操作完檔案時,如果不關閉檔案,那麼將對系統造成資源浪費,因為系統可開啟的檔案描述符數量是有限制,比如 linux 是 65536,所以必須要關閉檔案。

f = open("test.txt", mode="w")

content = u"python之禪"

content = content.encode(encoding='utf-8')

f.write(content)

f.close()

close 就萬事大吉了嗎?未必。

因為有可能在呼叫 open 函式的時候就報錯了,比如因為許可權問題沒法在該目錄讀寫檔案,此時,檔案物件都沒建立成功,呼叫close肯定會報錯。

再比如在第4行 write 的時候有可能報錯,因為磁碟空間不足,這個時候報錯了, close 方法就沒有機會執行了。

正確地做法是用 try except 對異常進行捕獲。注意,open 函式要在 try **塊外面

f = open("output.txt", "w") try: content = u"python之禪" f.write(content.encode(encoding='utf-8')) except ioerror as e: print("oops, %s" % e.args[0]) finally: f.close()

不過,更優雅的寫法是用 with ... as 寫法,因為 檔案物件實現了上下文管理器協議,程式進入 with 語句塊時,會把檔案物件賦值給變數 f,在程式退出 with 語句塊的時候會地自動呼叫 close 方法。

with open("output.txt", "w") as f: content = u"python之禪"

f.write(content.encode(encoding='utf-8'))

最後還有乙個問題是相容性,python2 與python3 的 open 函式不一樣,後者可以在函式中指定字元編碼格式,而 python2 則沒有。

with open("output.txt", "w", encoding="utf-8") as f: content = u"python之禪" f.write(content)

那麼如何寫出同時相容2和3的open函式呢?

沒錯,使用 io 模組下的 open 函式,python2 中的 io.open 等價於 python3 中的 open 函式,可以指定 encoding 引數,同時 python3 也保留有 io.open 函式

from io import open with open("output.txt", "w", encoding='utf-8') as f: f.write(u"python之禪")

總結:讀寫檔案時,應該考慮的問題包括:字元編碼問題,操作完檔案要即時關閉檔案描述符,同時還要注意**的相容性。

PHP如何讀寫檔案

php讀寫檔案,就如同 asp中使用fso進行檔案的讀寫操作。當然在asp中fso僅對於執行當前程式的伺服器磁碟上檔案進行讀寫 很明顯就是需要獲得物理路徑 然而php可以通過ftp或http開啟檔案進行讀寫。一,php如何讀取檔案 php讀取檔案可以讀取當前伺服器或遠端伺服器中的檔案。其步驟是 開啟...

MATLAB如何讀寫檔案

很多時候,使用matlab生成資料和處理是一種不錯的選擇,往往需要讀取指定路徑的檔案,有時候還需要遍歷檔案,或者將處理的資料儲存在指定路徑的檔案之中,那麼如何使用matlab來讀寫檔案呢?if exist d path dir mkdir d path endfid fopen path,r pro...

PHP如何讀寫檔案

php如何讀寫檔案 php讀寫檔案,就如同asp中使用fso進行檔案的讀寫操作。當然在asp中fso僅對於執行當前程式的伺服器磁碟上檔案進行讀寫 很明顯就是需要獲得物理路徑 然而php可以通過ftp或http開啟檔案進行讀寫。一,php如何讀取檔案 php讀取檔案可以讀取當前伺服器或遠端伺服器中的檔...