环境:python2.7
问题描述:操做具备中文名称的文件的时候,会出现编码报错
好比:python
>import pandas as pd >df = df.read_csv(r"7w_白名单返回.csv") 输出: IOError: File 7w_鐧藉悕鍗曡繑鍥�csv does not exist
一、缘由: 与python的字符处理机制有关web
python2.x对字符的默认处理以下:
一、python2.x,默认全部的字符都是ASCII编码格式;
二、在python2.x的执行内存中,任何编码都被统一转换(decode)为Unicode格式来进行程序处理。数组
因此python2.x处理字符时候的工做原理是:python2.7
一、 python接收到的任何字符,都默认为是ASCII编码格式;
二、而后将ASCII格式转变成Unicode格式,在内存里进行操做,操做完成后,输出结果,此时结果是Unicode格式;
三、再将Unicode格式默认转变成ASCII格式输出到工做台。ide
因此,当原始字符不是ASCII编码格式的时候,好比GBK、GB23十二、UTF-8编码格式等,python2.x进行处理的时候,就会报错或者出现乱码的状况。常见的例子就是进行文件读取的时候。svg
进一步解释,如下为引用:函数
Python中的字符串的大概分为为str和Unicode两种形式。其中str经常使用的编码类型为utf-8,gb2312,gbk等等,Python使用Unicode做为编码的基础类型。str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,彻底取决于其解码的编码将他解码成什么样子;Unicode是一种相似于符号集的抽象编码,它只规定了符号的二进制代码,却没有规定这个二进制代码该如何存储,也就是它只是一种内部表示,不能直接保存,因此存储时须要规定一种存储形式,好比utf-8等。编码
二、解决办法code
使用编码转换函数,将原始字符从任意编码格式直接变成Unicode格式。xml
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%)。