成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

給Python新手的一道面試題:如何正確讀寫文件

開發 開發工具
讀寫文件時,應該考慮的問題包括:字符編碼問題,操作完文件要即時關閉文件描述符,同時還要注意代碼的兼容性。

 

[[203305]]

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

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

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

分析:Python 提供了內建函數 open 用于讀寫文件,函數返回一個文件對象,可對文件進行讀、寫操作,用參數 mode 來控制。

默認是讀文件

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

上面這段代碼如果在python2中運行,會報錯:

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

這是一個字符編碼的問題,編碼錯誤是Python程序員最經常遇到的錯誤,之前在公眾號中寫過關于編碼錯誤的原因。

之所以報錯是程序沒法直接保存 unicode 字符串,要經過編碼轉換成而 str 類型的二進制字節序列才能夠保存。

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

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

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

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

  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 就萬事大吉了嗎?未必。

因為有可能在調用 open 函數的時候就報錯了,比如因為權限問題沒法在該目錄讀寫文件,此時,文件對象都沒創建成功,調用close肯定會報錯。

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

正確地做法是用 try except 對異常進行捕獲。注意,open 函數要在 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() 

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

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

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

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

那么如何寫出同時兼容2和3的open函數呢?

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

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

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

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2024-10-11 17:09:27

2018-03-06 15:30:47

Java面試題

2011-05-23 11:27:32

面試題面試java

2023-02-04 18:24:10

SeataJava業務

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2017-11-21 12:15:27

數據庫面試題SQL

2022-04-08 07:52:17

CSS面試題HTML

2009-08-11 15:09:44

一道面試題C#算法

2021-05-31 07:55:44

smartRepeatJavaScript函數

2023-08-01 08:10:46

內存緩存

2021-10-28 11:40:58

回文鏈表面試題數據結構

2021-03-16 05:44:26

JVM面試題運行時數據

2022-02-08 18:09:20

JS引擎解析器

2015-09-02 14:09:19

面試題程序設計

2017-03-10 09:33:16

JavaScript類型

2011-03-02 10:58:16

SQL server入門面試題

2021-03-27 10:59:45

JavaScript開發代碼

2011-06-14 09:12:03

JavaScript

2018-02-01 16:26:44

面試題static變量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人免费视频在线观看 | 无人区国产成人久久三区 | 欧美一区二区三区在线观看 | 国产精品久久精品 | 久久综合一区二区三区 | 香蕉久久网 | 亚洲精品一区二区三区蜜桃久 | 欧美福利视频 | 欧美日韩成人在线 | 在线免费观看成人 | 网站黄色在线免费观看 | 国产大片一区 | 看av网址 | 一区在线观看 | 91视频在线 | 国产免费一区二区 | 美女三区| 欧美国产日韩一区二区三区 | 亚洲精品视频免费观看 | 亚洲一区二区国产 | 久久91| 日韩欧美三级在线 | h在线看 | 国产亚洲一区二区三区在线观看 | 毛片网站在线观看 | 亚洲成人第一页 | 久久精品欧美一区二区三区不卡 | 三级成人在线 | 成人免费小视频 | 亚洲综合区 | 日本高清视频在线播放 | 9191av| 亚洲精品久久久一区二区三区 | 国产精品a一区二区三区网址 | 国产精品一区在线观看 | 男女黄网站 | 成人一区在线观看 | 欧美1—12sexvideos| 久久精品视频免费观看 | 福利视频网站 | 亚洲 欧美 另类 综合 偷拍 |