python编码问题的最终分析
python初学者,往往因为字符编码的问题而苦恼不已,本人也是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果。下面一段代码是在python3.5上的,以它为例进行讲解(请忽略糟糕的变量名)。
#!/usr/bin/env python # -*- coding:utf-8 -*- import re import urllib.request def get_html(url): download_page = urllib.request.urlopen(url).read().decode('GBK') return download_page def get_image(html): img_list = re.findall(r'src="(.+?\.jpg)"', html) x = 1 for img_url in img_list: print("正在下载" + str(x) + "") urllib.request.urlretrieve("https:" + img_url.lstrip(), 'd:\\list\\%s.jpg' % x) x += 1 html_page = get_html("https://mm.taobao.com/self/aiShow.htm?spm=719.7763510.1998643336.43.xMxXj5&userId=722569871") get_image(html_page)
这是一个很简单的网络图片爬虫,代码本身并没有什么特色和难点。我们主要关注的是编码问题。由于是python3.5的环境,代码第二行可以没有。
网上多数文章都没有清晰的指出一个问题:编码问题分“代码的编码”和“网页或文件的编码”。什么意思?就是在写代码时要同时考虑代码本身的编码和你的代码要处理的网页或文件对象的编码!这是两个方面,不能混淆!
1、先来说说代码的编码:
代码的编码指的是你用vim、notepad、UE、IDE等等文本编辑工具或集成环境,通过键盘输入字符,并保存成文件储存在硬盘的东西。在以往python2.x版本的时候,默认使用ASCII码,它使用一个字节也就是8位空间,只存储127个英文系字母/字符,通俗的讲,它只支持英语,不支持中文。因此,如果在代码里输入中文,编译会报错,我们往往采取在代码文件第二行顶头进行编码声明的方式来解决这个问题,也就是#coding:utf-8。通过这一行,就指定了代码文件里的所有字符都使用utf-8的编码格式进行存储,而在utf-8里是支持中文的,也就是说,你可以直接这样:name=‘jack’ 和 name2= '张三'。而在python3.x版本中,unicode编码成为了默认编码,unicode也是一个同时支持英文和中文的编码格式,因此你连第二行的编码申明都可以不用了,直接使用中文就好了。
但是,#coding:utf-8解决不了你在处理网页和数据文件中的编码问题,它只针对代码本身!
2、再说说网页或文件对象的编码:
在python代码中,处理网页和文件系统上的数据文件,是再正常不过的事了,比如各种爬虫,比如文件读取。上面我们解决了代码自己的编码,但是并没有解决处理对象的编码!什么意思?以文章开头的代码为例,它用来爬取一个网页的图片,而这个网页是用GBK编码的(这是一种中文编码方式)。可以通过查看页面源代码得知。
页面被读取后,以GBK编码格式暂存在内存。但是,内存里处理字符都是用unicode编码格式的!这就存在了问题。
上面的错误信息就是因为编码冲突造成的。我们需要解码!
解码的方法是decode('编码格式'),它可以将别的编码格式转换成unicode。例如decode('GBK')、decode('utf-8')。解码后爬取下来的网页就以unicode编码格式存储在内存里,然后可以被正常的进行正则分析,匹配,查找,而不会报错。
同样我们也可以进行编码encode(),它可以将unicode编码格式转换成别的编码格式,一般都是utf-8。
总结:其实编码问题没有想象中那么复杂,大家只要分清楚这里的两部分,就很容易搞定。可以利用上面的代码,注释掉
decode('GBK')这部分做个试验。有不正确的地方,请大家指正!
python编码问题的最终分析的更多相关文章
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python 编码简单说
先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- python编码规范
python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...
- 【转】python编码的问题
摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- python 编码 UnicodeDecodeError
将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...
- Python编码/文件读取/多线程
Python编码/文件读取/多线程 个人笔记~~记录才有成长 编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
随机推荐
- 忘记hmailiserver邮件服务器后台登陆密码解决
进入后台进行hmailiserver的相关设置,发现登陆密码忘记了,如下图:
- 代码生成器Kalman Studio2.2发布,完美支持Oracle,不需要安装Oracle客户端
这次更新主要是增加对Oracle的支持,不需要安装Oracle客户端,下面的配置文件列出了Kalman Studio支持的几种数据库 <?xml version="1.0" ...
- Andriod读取XML问题
终于搞明白了,Andriod读取资源只能在asserts文件夹下或者scard上,其他地方是不行的. 文件加在XML后,就可以读了. 一句话就搞定了: InputStream istr = getAs ...
- 谢谢博客-园,让我不再有开源AYUI的想法
第一次 第二次 教程不会在博客园上写了,具体的看我官网博客吧,谢谢大家了 ================= 我是个有素质的程序员 艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹艹 ...
- Django 源码小剖: Django 对象关系映射(ORM)
引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...
- 转:NO.523 Aidan Hawken&Carina Round - Walking Blind
NO.523 Aidan Hawken&Carina Round - Walking Blind 好像是好几天没来更新过 也没有找歌 因为这几天一直在追美剧 吸血鬼日记 好不容易 今天追到了第 ...
- Android studio NDK 编译 "$USE_DEPRECATED_NDK=true" 异常问题解决
我的项目是https://github.com/leixiaohua1020/simplest_ffmpeg_mobile/tree/master/simplest_ffmpeg_android_st ...
- 康力优蓝机器人 -- 优友U05类人型机器人发布
[寒武计划]优友U05类人型机器人发布: http://digi.tech.qq.com/a/20151124/043234.htm?pgv_ref=aio2015&ptlang=2052 北 ...
- android一键分享功能不使用任何第三方sdk
在android中有自带的一键分享功能,不过它会把所有带分享的应用都找出来,如果我们只需要一些常见的分享应用,该如何做呢? 下面看我的效果图(横屏和竖屏自动适配): 接下来看我的调用(支持图片和文字分 ...
- ios 同步Get请求的实现
//第一步,创建URL NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/search?term=微信&enti ...