python3读取utf-8、gbk文件、编码转换、测试

来源:赵克立博客 分类: Python 标签:编码发布时间:2017-10-04 17:48:28最后更新:2019-03-03 14:10:34浏览:20358
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2019-03-03 14:10:34
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

平时用的最多的就是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里面写几个汉字

image.png

以二进制读取后解码并打印

with open('D:/1.txt','rb') as f:
        print(f.read().decode('utf-8'))
input('...')

cmd下显示正常

image.png

pycharm下也正常

image.png

如果把上面decode('utf-8')改成decode('gbk')则全部都显示错

UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 2: illegal multibyte sequence


测试GBK文件文件

把文件转成gbk文件,简体中文系统在ansi就代表gbk编码

image.png

代码改为:

with open('D:/1.txt','rb') as f:
        data=f.read()
        print(data)
        print(data.decode('gbk'))
input('...')

cmd下显示

image.png

pycharm显示

image.png

如果把上面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输出结果

image.png

pycharm输出结果

image.png

可以看出编码转换等都是正常的

测试从网络读取数据显示

抓取百度的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

image.png

pycharm下面输出正常

image.png

由上面分析,我们明明已经把字节解码啦为啥还出现个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下面都正常显示啦



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python