python3读取utf-8、gbk文件、编码转换、测试
平时用的最多的就是print输出看下效果,but 打印的时候老是能遇到知种编码报错这个字符不能编码那个字符不能解码等。
下面就做个测试记录下看哪种情况下会报错
执行环境
cmd运行环境编码为936也就是gbk
pycharm运行环境为utf-8
python3编码说明
先简单说下编码,unicode是国际统计的一种编码规范,utf-8就是使用这种规范实现的一种多字节编码。这个要搞清楚不清楚的自行搜索了解
python3中处理字符默认用的编码是utf-8,
源代码中给变量赋值字符串时默认是unicode也就是str类型这两个是同一个意思(这一点跟python2区别很大)
str(unicode)是可以直接车换成对应的utf-8或gbk文本的。
但是实际使用过程中却遇到很多报错
测试utf-8文本文件
在D盘根目录创建一个文本文件编码为utf-8里面写几个汉字
以二进制读取后解码并打印
with open('D:/1.txt','rb') as f: print(f.read().decode('utf-8')) input('...')
cmd下显示正常
pycharm下也正常
如果把上面decode('utf-8')改成decode('gbk')则全部都显示错
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 2: illegal multibyte sequence
测试GBK文件文件
把文件转成gbk文件,简体中文系统在ansi就代表gbk编码
代码改为:
with open('D:/1.txt','rb') as f: data=f.read() print(data) print(data.decode('gbk')) input('...')
cmd下显示
pycharm显示
如果把上面decode('gbk')改成decode('utf-8')则全部都显示错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte
对utf-8文本进行编码转换再输出
with open('D:/1.txt','rb') as f: data=f.read() print("utf8 bytes: %s"%(data)) data1=data.decode('utf-8') print("utf8 text: %s"%(data1)) s=data1.encode('gbk') print("gbk bytes: %s"%(s)) print("gbk text: %s"%(s.decode('gbk'))) input('...')
cmd输出结果
pycharm输出结果
可以看出编码转换等都是正常的
测试从网络读取数据显示
抓取百度的utf-8网页
import urllib.request #url url="http://www.baidu.com/" #请求 request = urllib.request.Request(url) #爬取结果 response = urllib.request.urlopen(request) s = response.read() s=s.decode('utf-8') print(s) input('...')
好啦cmd下面报错
UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 27226: illegal multibyte sequence
pycharm下面输出正常
由上面分析,我们明明已经把字节解码啦为啥还出现个gbk编码错误呢?
因为cmd界面是gbk编码的print输出的时候要把文本用gbk编码成字节然后才输出,然而就是编码成字节这一步出错啦,为啥会出错呢。因为我们取到的文本里并不全是使用标准utf-8编码的可能有一部分是用的是其它编码。混合进去啦。既然它使用gbk编码出错啦那么我们来帮它编码下试试
import urllib.request #url url="http://www.baidu.com/" #请求 request = urllib.request.Request(url) #爬取结果 response = urllib.request.urlopen(request) s = response.read() s=s.decode('utf-8') s=s.encode('gbk','ignore').decode('gbk'); print(s) input('...')
如上面代码,我们把它转换成gbk编码编码的时候忽略错误试一下
这次cmd和pycharm下面都正常显示啦