注:該文章基于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指令檢視檔案詳情:

可以看到第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:
最後使用:wq指令寫入檔案并退出vim即可。