关于编码解码、codecs.open()、json.dumps()以及python版本的一些教训

今天在学习《python绝技:虫术》这本书的时候遇到了一些十分蛋疼的问题,以至于直接浪费了我一个下午的宝贵时间。

开题知识温故知新:何谓编码解码?
编码:江湖人称encoding,文字转二进制(通俗)
解码:江湖人称decoding,二进制转文字(通俗)
与传统中文的字面意思不同
(注意,Unicode虽然也是由0、1组成,但是编码之后的就是Unicode类型,未编码的就是bytes类型)
不能对unicode编码,不能对文字解码编码
在计算机工作的过程中,一般都是用Unicode在工作,utf-8在展示,如:
1.服务器会通过Unicode来处理数据,然后在网页的展示过程中,对Unicode进行解码,变成我们看到的utf-8人类文字
2.我有点忘了别的实例,我暂时有点想不起来了
👆一言以蔽之:👇
UTF-8管面子(章子怡她爸),Unicode管里子(赵本山)
耍一手一代宗师的梗
**
/我是分割线

1.json.dumps()

这玩意在python3中,其在转化格式的时候会自动改变编码格式,以至于在最后的时候会导致之前整整齐齐的UTF-8编码的中文字符串变成了鬼畜的十六进制,具体解决方法在codecs.open中会提到

2.codecs.open()

原来在python2中的蛋疼编码,导致了当时用open只能将str类型的数据写入txt,但是在爬虫爬取的过程中,总会出现一些离谱的问题:特别是会爬取到一些不同格式的字符(如big5,ascii等),所以在这个情况之下,我们就需要将原来爬取到的所有数据都转化为python的一般等价物:Unicode!
然后,麻烦的事情就出现了。。。你需要将原来的信息通过先编码成Unicode,然后再解码成为str才可以,但是,一个小小的codecs.open()就解决了所有的问题

with codecs.open('result.json','w','utf-8')as file:
    file.write(json.dumps(items,ensure_ascii=False))
	#上面两个鬼畜问题的解决方案
	#需要同时使用
	#由于python的版本变化,python3的编码明显有好转,(接上下一行)
	#也可以使用with open('result.json','w',encoding='utf-8')as file:

网上大佬建议:
1.Python3直接用open。
2.Python2.x下用codecs.open,特别是有中文的情况,然后也可以避免踩到2.6下面io.open的坑。
3.如果希望代码同时兼容Python2和Python3,那么推荐用codecs.open。(对于我们萌新机会不大)

3.Beautifulsoup的编码问题

编码动作和解码动作参照的编码格式不一样,导致乱码。

print(response.encoding)
#输出编码格式

在python3中取消了解码这个东西,所以在对于一个response,由于原来的编码格式是ISO-8859-1,我们需要将其中的中文变成有序的话,有如下几个办法:

**1.用response.encoding("utf-8")
2.用response.content.decoding("utf-8")解码**

当然,最重要的还是要在程序的开头写上一句我一直以来都以为没用的话:

# coding=utf-8
#相当重要!!!!!!!

4.萌新看python2、3之间的区别

md为什么python3都这么流行了还会有python2这种东西。。。
学校图书馆里的书还是旧的,repr(),json.dumps()在python2中运行的结果完全不一样,以后找参考资料的时候还是一定要睁大眼睛看看清楚!!!
不过我那本书上面是这样写的“本书兼顾python2和python3。。。这你让我这个萌新哑口无言,无言以对啊我干,那我™看你的书用什么编译器???
重要教训:
1.先分清楚python2、3再看教材、参考书,不要乱jb看
2.做事情头脑要清晰,累了出去转转

保持高效率兄弟!加油你可以的!
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值