本文記錄使用python在讀取檔案時的一些心得體會。
使用open
方法讀取檔案時,經常會遇到這樣的問題:
unicodedecodeerror: 'gbk' codec can't decode byte 0xaa in position 205: illegal multibyte sequence
open
方法原型如下:
open(file, mode='r', buffering=-1, encoding=none, errors=none, newline=none, closefd=true, opener=none)如果encoding未指定,會使用平台預設的編碼方式,該方式可通過
import locale來獲得。本人的windows為locale.getpreferredencoding(false)
cp936
,linux為ansi_x3.4-1968
和utf-8
。
上述問題出現的原因,是因為檔案全部或者部分內容的編碼方式與讀取的編碼方式不一致。
注意:以二進位制方式讀寫檔案時,encoding引數會被忽略。
解決方案:
方案一:修改資料來源的編碼方式,使其以期望的格式儲存,再以期望的格式開啟即可。修改原始編碼方式可能會造成檔案亂碼,慎重使用。
方案二:對於含有中文內容的檔案來說,可以用包含更大容量字元數的編碼方式來開啟。gb2312 < gbk < gb18030
方案二:使用 errors 引數來忽略錯誤行,有不同的忽略級別:
使用pandas,從csv格式檔案中讀取資料,可使用read_csv
函式,該函式有很多有用的引數,現把常用的列舉如下:
編碼歷史發展,從最開始的ascii編碼(單位元組編碼),到相容ansi和常用中文的gb2312編碼(雙位元組編碼)、gbk(對gb2313的擴充套件),在擴充套件編碼中,將ascii中原有的數字、標點和字元等統統重新編碼為兩位元組長,這就是「全形」字元。原來在ascii範圍內的稱為「半形」字元,
但這樣針對每種文化各自指定一套,不利於全球交流,於是iso國際組織針對全球現有的文化、字母和符號,指定統一編碼,稱為unicode
編碼方式(2個位元組),它只規定各種字元的二進位制定義,但具體使用多少個位元組來儲存,沒有做規定,於是出現各種unicode
傳輸編碼,例如:utf-8,變長編碼方式,使用1~4個位元組表示乙個符號,根據不同符號長度而變化位元組長度。ascii字元使用乙個位元組,中文使用三個位元組。
utf-16,統一使用2個位元組來傳輸。
unicode是二進位制編碼方式,是所有編碼之間轉換的中介。例如utf-8和gbk之間需要通過unicode編碼進行中轉,才能相互轉換。python提供了encode和decode兩個函式來進行編碼轉換。
參考文件:
pandas系列 read_csv 與 to_csv 方法各引數詳解(全,中文版)
python中文編碼中文亂碼問題
python高階讀取檔案 Python讀取檔案內容
開啟檔案之後,就可以讀取檔案的內容,檔案物件提供多種讀取檔案內容的方法。開啟test.txt檔案 f open test.txt r 開啟test.txt檔案 f.close 關閉檔案 test.txt檔案有以下內容 hello world.hello python.hello imooc.讀取若干...
Python檔案讀取
python提供了多種方法實現檔案讀取操作 1 read 2 readline 3 readlines 4 xreadlines 很多人也在糾結到底應該選擇哪種方式,甚至疑問在處理大檔案時應該選擇哪種方式,因為擔心檔案過大導致記憶體佔用率過高甚至無法完全載入。其實,這個問題是多餘的,在引入了迭代器和...
python檔案讀取
1.讀取txt檔案 read 讀取整行檔案 readline 讀取一行資料 readines 讀取所有行的資料 讀取txt檔案 user file open user info.txt r lines user file.readlines forline inlines username line...