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都是 ...
随机推荐
- Cocos2dx.3x入门三部曲-软件环境配置(一)
一.环境: Win7 32位 二.必备软件: l Java JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...
- JavaScript中的CSS属性对照表
盒子标签和属性对照 CSS语法(不区分大小写) JavaScript语法(区分大小写) border border border-bottom borderBottom border-bottom-c ...
- 解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
在web.config中加入 <httpRuntime maxRequestLength="22000" executionTimeout="43200" ...
- Android——GridView(网格视图)相关知识总结贴
Android API中文文档GridView http://www.apkbus.com/android-14131-1-1.html Android API 中文 (15) —— GridVi ...
- 分布式Hadoop安装(一)
本文旨在介绍通过两台物理节点,实现完全分布式hadoop程序的部署 writen by Bob Pan@20140609 环境介绍: 主机名 机器IP 用途 描述 Hadoop0 192.168.80 ...
- exam help
http://forceprepare.com/ http://forcecertified.com/certifications/certified-developer/ http://blog.l ...
- 机器学习编程语言之争,Python 夺魁【转载+整理】
原文地址 en cn 本文内容 表现平平的 MATLAB 貌似强大的 Julia 本身无错的 R 语言 逐渐没落的 Perl 老而弥坚的 Python 我个人很喜欢 Python~ 随着科技的发展,拥 ...
- [纯干货] MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- .NET Actor Model Implementations Differ in Approach
Last week Vaughn Vernon, author of Implementing Domain-Driven Design, published Dotsero, a .NET Acto ...
- CentOS 7.2 安装配置 Percona Server
个人比较喜欢 MYSQL 的轻量,今天花了一点时间把阿里云上的 MYSQL5.7 换成了 Percona-Server ,Percona 是一个开源的 MySQL 衍生版.InnoDB的数据库引擎使得 ...