注:该文章基于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即可。