天天看點

python申明檔案編碼_mac中python讀取csv檔案編碼報錯問題解決

注:該文章基于mac環境。

之前在寫一個簡單的分班程式的時候,使用如下指令行讀取csv檔案,

with open('city.csv') as f:

lines = f.readlines()

出現了報錯:

‘utf-8’ codec can’t decode byte 0xb1 in position 0: invalid start byte

含義為程式由于檔案編碼問題無法讀取檔案。查找了一些解決方法後終于解決,稍稍總結。

出現此種問題的原因,可能來自python程式本身或檔案。一是python檔案可能沒有聲明讀取檔案的編碼方式,導緻程式無法讀取,對應解決方法一;二是檔案本身的編碼不是utf-8格式,導緻程式無法讀取,對應解決方法二。

解決方法一:在python檔案中加入編碼方式聲明

在python檔案開頭加入一行編碼方式聲明代碼,使用# -*- coding: utf-8 -*-或#code=utf-8均可。該行聲明了該python程式讀取檔案的編碼格式為utf-8。

如果是由于python程式出現的問題,此時再次運作程式,應不再報錯。如仍報錯,可使用方法二解決。

解決方法二:修改檔案編碼方式/修改程式讀取方式

假設檔案存放路徑為/Desktop/system_code/city.csv。打開終端(在應用程式搜尋“terminal”),使用cd指令檢視system_code檔案夾并使用vim指令打開city.csv, 代碼如下:

$ cd Desktop/system_code/

$ vim city.csv

此時終端會顯示檔案詳細内容。之後使用:set指令檢視檔案詳情:

python申明檔案編碼_mac中python讀取csv檔案編碼報錯問題解決

可以看到第4行中fileencoding=latin1,說明此時檔案編碼方式為latin1而非utf-8。

1.修改程式讀取檔案時的編碼方式

如果隻需要程式适應這一個檔案的話,直接修改程式讀取檔案的編碼方式即可,如下。

with open('city.csv', encoding="latin1") as f:

lines = f.readlines()

2.修改檔案編碼

有的時候程式需要讀取多個檔案,而對檔案本身就要求為utf-8的格式,這時候就隻能修改檔案編碼了。

之前在查找解決方式的時候看到了兩種,第一種使用iconv指令,修改成功。第二種使用vim指令,修改後檔案出現亂碼。這裡将兩種都列出。

2.1 使用iconv指令修改

指令為:

iconv -f gbk -t utf-8 origfilename > resultfilename

其中,-f後為源檔案編碼,-t後為轉換後檔案編碼,origfilename為需要轉碼的檔案,resultfilename為儲存至的檔案。之前我嘗試了使用latin1進行轉碼,發現轉出後為亂碼,使用gbk則成功,不知道是不是因為檔案内容為中文。

以我的檔案為例,需要轉碼的檔案為city_latin.csv, 希望将轉碼後檔案儲存為city_new.csv,則使用如下指令:

iconv -f gbk -t utf-8 city_latin.csv > city_new.csv

之後使用vim指令檢視city_new.csv的編碼可看到city_new.csv為正常的utf-8編碼檔案。

2.2 使用vim指令修改

注:此方式在我的電腦中轉換出現亂碼,是以不推薦。

:set fileencoding=utf-8

之後再次使用:set指令檢視檔案格式,可發現檔案的編碼格式已經被修改為utf-8:

python申明檔案編碼_mac中python讀取csv檔案編碼報錯問題解決

最後使用:wq指令寫入檔案并退出vim即可。