看題:請指出下面**段中的錯誤
f = open("test.txt", mode="w")引數 說明f.write(u"python之禪")
分析:python 提供了內建函式 open 用於讀寫檔案,函式返回乙個檔案物件,可對檔案進行讀、寫操作,用引數 mode 來控制。
r 讀檔案(預設)
w 寫檔案 (如果檔案中有內容,已有的內容將被覆蓋)
a 寫檔案(如果檔案中有內容,新內容追後到檔案後面)
預設是讀檔案
f = open("test.txt")traceback (most recent call last):f.read()
python之禪
上面這段**如果在python2中執行,會報錯:
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")因為有可能在呼叫 open 函式的時候就報錯了,比如因為許可權問題沒法在該目錄讀寫檔案,此時,檔案物件都沒建立成功,呼叫close肯定會報錯。content = u"python之禪"
content = content.encode(encoding='utf-8')
f.write(content)
f.close()
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讀取檔案可以讀取當前伺服器或遠端伺服器中的檔...