python3编码问题(网络流数据写入到本地出错问题)

来源:互联网 发布:淘宝联盟转链工具 编辑:程序博客网 时间:2024/06/10 16:14

目录

      • 目录
      • 1python3两种编码类型
      • 2图解py3一切编码问题
      • 3实例网络爬取数据写入到txt问题
      • 就到这里

1、python3两种编码类型

记住:在python3中只有两种字符格式,**str类型和bytes类型**。str类型:即常见的str字符,py3中默认所有的字符串都为Unicode编码格式;bytes类型:即字节字符,除过unicode格式的字符串外,其他都为bytes类型。
>>>a='姚明'>>>type(a)<class 'str'>>>>type(a.encode('utf-8'))<class 'bytes'>>>>type(a.encode('gbk'))<class 'bytes'>>>>type(a.encode('gb2312'))<class 'bytes'> 

2、图解py3一切编码问题!!!

需求:有一个外部数据,需要加载到python中,并最终写入到本地txt中。
三个主体:外部数据,python解释器,本地文件。

1. str-->bytes,相当于编码过程encode()2. bytes-->str,相当于解码过程decode()

编码过程示意图

注意:py3中的所有编码问题,无非就是encode()与decode()。思路:在python解释器中,所有的字符都是unicode格式,人们可以正常查看不乱码,外部数据进入到python中,必须先进行解码decode(),使其转换为py3中默认的unicode格式;当将此数据写入到本地txt中时,就需要根据txt的编码格式,将数据编码为txt编码格式。

3、实例:网络爬取数据写入到txt问题

个人环境:python3.5,WIN7 64位
将爬取到豆瓣影评数据写入到本地txt中,定义函数write_txt:

# eachCommentList为爬取的影评数据,list格式,每个元素为一个影评def write_txt(eachCommentList, filename):    filepath = "E:\\untitled\\practice\\"    output = open(filepath + "%s.txt" % filename, "a")  # a表示在结尾写入    for i in range(len(eachCommentList)):        output.write(str(i) + ": " + eachCommentList[i] + "\n")    output.close()
1、执行write_txt(eachCommentList, 'data1'),错误如下:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 9: illegal multibyte sequence##原因分析:在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。因为py3头文件明确了编码格式为utf-8,所以,也要将目标文件的编码格式设置为utf-8。##解决的办法:改变目标文件的编码:output = open(filepath + "%s.txt" % filename, "a", encoding='utf-8') 
2、出现can't concat NavigableString  to str错误:解决办法:则将字符串强制转化为str,采用str(chacter): t = str(eachCommentList[i]) output.write(str(i) + ": " + t + "\n")
##改进后,完整代码如下:def write_txt(eachCommentList, filename):    filepath = "E:\\untitled\\practice\\"    output = open(filepath + "%s.txt" % filename, "a", encoding='utf-8')  # a表示在结尾写入    for i in range(len(eachCommentList)):        t = str(eachCommentList[i])        output.write(str(i) + ": " + t + "\n")    output.close()

就到这里…


若有错误,请帮忙指出。
蹄疾步稳,切地而行,以行践言!—zlg358


原创粉丝点击