Python新手必看面試題 如何正確讀寫檔案

2022-06-08 02:42:07 字數 2214 閱讀 9881

廢話不多說,看題:請指出下面**段中的錯誤

>>> f.write(u"python阿喵")

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

引數說明

r讀檔案(預設)

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

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

預設是讀檔案

>>> 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 型別。

>>> content = u"python阿喵"

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

>>> f.write(content)

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

>>> content = u"python阿喵"

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

>>> f.write(content)

>>> f.close()

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

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

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

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

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 方法。

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 函式

with open("output.txt", "w", encoding='utf-8') as f:

f.write(u"python阿喵")

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

python語法面試題 python面試題

1.去重,集合 集合的乙個重要特點是 自動去除重複的值 li 1,2,3,1,1,2,2,3,3 去除重複的元素 set set li 轉換為集合,因為集合會自動去重。print set li list set 將集合轉換為列表print li 2.生成器 規則 生成器函式,或者生成器表示式,在呼叫...

python面試題之Python如何實現單例模式?

使用 metaclass 元類 的高階python用法 class singleton2 type def init cls,name,bases,dict super singleton2,cls init name,bases,dict cls.instance none def call cl...

軟體測試面試必看寶典 含面試題和筆試題

希望這30道面試問題能幫助到大家,望各位能找到自己滿意的工作 1 專案中碰到的需求問題,能夠直接和客戶溝通嗎?能,我在專案組中是對外介面人,我可以直接和客戶方的代表開會進行溝通 不能,我們需要將問題整理到一起,由專案經理和測試經理作為介面人和客戶進行溝通 我們的需求是產品線提的,關於需求問題我們直接...