从读写文件看Python的编码处理
本文的测试环境:Python 2.7
注:新手学习笔记
当前环境下,直接输入中文,显然会报错
Non-ASCII character '\xe4' in file F:/pythons_environment_files/filecheck.py on line 3
这时候你需要在开头加上
# _*_ coding:utf-8
然后,你就可以妥妥的各种print中文了
----------------------------
现在开始读写文件,我们准备了utf-8编码的文件和gb2312编码的文件各一份
(ps:utf-8文件的生成方式,1、txt另存为可以修改编码方式,2、使用notepad++的同学可以直接在编码里面修改)
utf8url = ‘C:\Users\Administrator\Desktop\UTF-8测试.txt’
file1 = open(utf8url) #打开文件
到这里,调试发现报错了
IOError: [Errno 2] No such file or directory: 'C:\\Users\\Administrator\\Desktop\\UTF-8\xe6\xb5\x8b\xe8\xaf\x95.txt'
报错提示文件找不到,但是我们的文件的确是存在的,查看错误信息,发现文件名的编码不正常
处理方式:
方式1:utf8url = u ‘C:\\Users\Administrator\Desktop\\UTF-8测试.txt’
方式2: file1 = open(utrf8url.decode(‘utf-8’))
注:两种方式从本质上是一样的,将文件名转成unicode字符
继续读取,发现一切正常
然后我们换编码是gb2312的文本进行测试
gbkurl = u'C:\\Users\Administrator\Desktop\GBK测试.txt' #这里我们直接使用转换为unicode的路径,避免出现错误
file2 = open(gbkurl)
print file2.read()
打印结果
GBK�����ı�
虽然没有报错,但是结果显然不是我们想要的,出现了乱码
解决方法:
对读取的结果进行解码操作
print file2.read().decode('gb2312')
观察打印结果
GBK测试文本 #结果一切正常
其实,写到这里,对于编码解码我依旧是蒙的
每次都是encode不行,使用decode
utf-8不行换gb2312,总会有一种可行的
为了编码这种情况的发生,我进行了如下尝试
代码如下:
s1 = '张三'
s2 = u‘张三’
print s1
print s1.decode('utf-8')
print s1.decode('gb2312')
print s1.encode('utf-8')
print s1.encode('gb2312')
#-------
print s2
print s2.decode('utf-8')
print s2.decode('gb2312')
print s2.encode('utf-8')
print s2.encode('gb2312')
哪些可以得到我们想要的结果呢
这些是可以输出的
print s1
print s1.decode('utf-8')
print '----------'
print s2
print s2.encode('utf-8')
print s2.encode('gb2312')
可以看到print s2.encode('gb2312')显示乱码,其他都正常显示
我们因此得出结论
1、python环境下,支持显示字符串和unicode字符,只是非utf-8的字符串,会显示乱码
2、unicode字符要转成字符串,需要进行encode编码,具体的编码方式,就得看你想转成什么编码格式的字符串
3、字符串想转成unicode字符,需要进行decode解码,使用什么解码方式,与字符串本身的编码方式一致
eg:utf-8的字符串想解码,就必须使用decode('utf-8')来执行
再来思考文件中显示的乱码,乱码其实就是一种不支持的编码方式编码的字符串
你需要解码成unicode字符进行显示,也可以转成utf-8的字符串进行显示
对s2.encode('gb2312')乱码的修改
s2.encode('gb2312').decode('gb2312')
或者
s2.encode('gb2312').decode('gb2312').encode('utf-8')
再者,对于为什么从txt文件读取的字符串是gb2312的编码
我个人的想法是读取操作是把字符串-字节流-字符串,本身并没有改变编码方式
各位看官,虽然写的很杂乱很麻烦,但是我对encode和decode深刻理解了,你呢?