从读写文件看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的文本进行测试

python写入文本文件指定编码 python读写文件指定编码_python写入文本文件指定编码

 

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深刻理解了,你呢?