日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
給Python新手的一道面試題:如何正確讀寫文件

這是我司前段時(shí)間招人筆試中一道比較簡單題,面向初中級(jí)程序員,不過很少有人能回答完整的,問題本身不難,主要還是考察動(dòng)手能力和基本代碼功,準(zhǔn)備找工作的先收藏留著以后用得著。

閩侯網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

看題:請(qǐng)指出下面代碼段中的錯(cuò)誤

 
 
 
 
  1. >>> f = open("test.txt", mode="w")
  2. >>> f.write(u"python之禪")

分析:Python 提供了內(nèi)建函數(shù) open 用于讀寫文件,函數(shù)返回一個(gè)文件對(duì)象,可對(duì)文件進(jìn)行讀、寫操作,用參數(shù) mode 來控制。

默認(rèn)是讀文件

 
 
 
 
  1. >>> f = open("test.txt")
  2. >>> f.read()
  3. python之禪

上面這段代碼如果在python2中運(yùn)行,會(huì)報(bào)錯(cuò):

 
 
 
 
  1. Traceback (most recent call last):
  2. File ““, line 1, in
  3. UnicodeEncodeError: ‘a(chǎn)scii’ codec can’t encode characters in position 6-7: ordinal not in range(128)

這是一個(gè)字符編碼的問題,編碼錯(cuò)誤是Python程序員最經(jīng)常遇到的錯(cuò)誤,之前在公眾號(hào)中寫過關(guān)于編碼錯(cuò)誤的原因。

之所以報(bào)錯(cuò)是程序沒法直接保存 unicode 字符串,要經(jīng)過編碼轉(zhuǎn)換成而 str 類型的二進(jìn)制字節(jié)序列才能夠保存。

write 方法會(huì)自動(dòng)幫你做編碼轉(zhuǎn)換,默認(rèn)使用 ascii 編碼格式,因?yàn)?ascii 字符集不能處理中文,所以出現(xiàn)了 UnicodeEncodeError 錯(cuò)誤。

正確的方式是在調(diào)用 write 之前手動(dòng)用 utf-8 或者 gbk 編碼轉(zhuǎn)換成 str 類型。

 
 
 
 
  1. >>> f = open("test.txt", mode="w")
  2. >>> content = u"Python之禪"
  3. >>> contentcontent = content.encode(encoding='utf-8')
  4. >>> f.write(content)

第二個(gè)問題是文件對(duì)象沒有正常關(guān)閉,有人可能要問了,不關(guān)閉會(huì)有什么影響,操作完文件時(shí),如果不關(guān)閉文件,那么將對(duì)系統(tǒng)造成資源浪費(fèi),因?yàn)橄到y(tǒng)可打開的文件描述符數(shù)量是有限制,比如 Linux 是 65536,所以必須要關(guān)閉文件。

 
 
 
 
  1. >>> f = open("test.txt", mode="w")
  2. >>> content = u"Python之禪"
  3. >>> contentcontent = content.encode(encoding='utf-8')
  4. >>> f.write(content)
  5. >>> f.close()

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

因?yàn)橛锌赡茉谡{(diào)用 open 函數(shù)的時(shí)候就報(bào)錯(cuò)了,比如因?yàn)闄?quán)限問題沒法在該目錄讀寫文件,此時(shí),文件對(duì)象都沒創(chuàng)建成功,調(diào)用close肯定會(huì)報(bào)錯(cuò)。

再比如在第4行 write 的時(shí)候有可能報(bào)錯(cuò),因?yàn)榇疟P空間不足,這個(gè)時(shí)候報(bào)錯(cuò)了, close 方法就沒有機(jī)會(huì)執(zhí)行了。

正確地做法是用 try except 對(duì)異常進(jìn)行捕獲。注意,open 函數(shù)要在 try 代碼塊外面

 
 
 
 
  1. f = open("output.txt", "w")
  2. try:
  3.    content = u"Python之禪"
  4.    f.write(content.encode(encoding='utf-8'))
  5. except IOError as e:
  6.     print("oops, %s" % e.args[0])
  7. finally:
  8.     f.close()

不過,更優(yōu)雅的寫法是用 with ... as 寫法,因?yàn)?文件對(duì)象實(shí)現(xiàn)了上下文管理器協(xié)議,程序進(jìn)入 with 語句塊時(shí),會(huì)把文件對(duì)象賦值給變量 f,在程序退出 with 語句塊的時(shí)候會(huì)地自動(dòng)調(diào)用 close 方法。

 
 
 
 
  1. with open("output.txt", "w") as f:
  2.      content = u"Python之禪"
  3.     f.write(content.encode(encoding='utf-8'))

***還有一個(gè)問題是兼容性,python2 與python3 的 open 函數(shù)不一樣,后者可以在函數(shù)中指定字符編碼格式,而 python2 則沒有。

 
 
 
 
  1. # python3
  2. with open("output.txt", "w", encoding="utf-8") as f:
  3.      content = u"Python之禪"
  4.     f.write(content)

那么如何寫出同時(shí)兼容2和3的open函數(shù)呢?

沒錯(cuò),使用 io 模塊下的 open 函數(shù),python2 中的 io.open 等價(jià)于 python3 中的 open 函數(shù),可以指定 encoding 參數(shù),同時(shí) python3 也保留有 io.open 函數(shù)

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

【本文是專欄作者“劉志軍”的原創(chuàng)文章,作者微信公眾號(hào):Python之禪(VTtalk)】


網(wǎng)頁名稱:給Python新手的一道面試題:如何正確讀寫文件
文章地址:http://www.dlmjj.cn/article/coosjhe.html