python2.7 小知识——操作中文名文件乱码等编码问题

环境: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%)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值