python2.7 操做中文名文件乱码等编码问题

环境: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%)。