环境:python2.7
问题描述:操作具有中文名称的文件的时候,会出现编码报错
比如:
>import pandas as pd
>df = df.read_csv(r"7w_白名单返回.csv")
输出:
IOError: File 7w_鐧藉悕鍗曡繑鍥�csv does not exist
1、原因:与python的字符处理机制有关
python2.x对字符的默认处理如下:
1、python2.x,默认所有的字符都是ASCII编码格式;
2、在python2.x的执行内存中,任何编码都被统一转换(decode)为Unicode格式来进行程序处理。
所以python2.x处理字符时候的工作原理是:
1、 python接收到的任何字符,都默认为是ASCII编码格式;
2、然后将ASCII格式转变成Unicode格式,在内存里进行操作,操作完成后,输出结果,此时结果是Unicode格式;
3、再将Unicode格式默认转变成ASCII格式输出到工作台。
所以,当原始字符不是ASCII编码格式的时候,比如GBK、GB2312、UTF-8编码格式等,python2.x进行处理的时候,就会报错或者出现乱码的情况。常见的例子就是进行文件读取的时候。
进一步解释,以下为引用:
Python中的字符串的大概分为为str和Unicode两种形式。其中str常用的编码类型为utf-8,gb2312,gbk等等,Python使用Unicode作为编码的基础类型。str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将他解码成什么样子;Unicode是一种类似于符号集的抽象编码,它只规定了符号的二进制代码,却没有规定这个二进制代码该如何存储,也就是它只是一种内部表示,不能直接保存,所以存储时需要规定一种存储形式,比如utf-8等。
2、解决办法
使用编码转换函数,将原始字符从任意编码格式直接变成Unicode格式。
python中有编码转换的函数有:
decode(string) 实现string解码成Unicode
encode(string) 实现Unicode编码成string
上面的例子,使用下面这种处理方法,就不会报错了:
import pandas as pd
df = pd.read_csv((r"7w_白名单返回.csv").decode("utf-8"))
字符串7w_白名单返回
是utf-8的编码格式,使用函数decode(“utf-8”),直接变成Unicoode的编码格式,再进行读取操作,就没问题了。
如果不知道字符串是什么编码格式,可以下面这个函数查看:
>import chardet
>chardet.detect(r'7w_白名单返回.csv')
输出:
{'confidence': 0.9690625, 'encoding': 'utf-8', 'language': ''}
confidence字段,表示检测的概率是1.0(即100%)。