Python每天必学之bytes字节


Posted in Python onJanuary 28, 2016

Python中的字节码用b'xxx'的形式表示。x可以用字符表示,也可以用ASCII编码形式\xnn表示,nn从00-ff(十六进制)共256种字符。

一、基本操作

下面列举一下字节的基本操作,可以看出来它和字符串还是非常相近的:

In[40]: b = b"abcd\x64"
In[41]: b
Out[41]: b'abcdd'
In[42]: type(b)
Out[42]: bytes
In[43]: len(b)
Out[43]: 5
In[44]: b[4]
Out[44]: 100 # 100用十六进制表示就是\x64

如果想要修改一个字节串中的某个字节,不能够直接修改,需要将其转化为bytearray后再进行修改:

In[46]: barr = bytearray(b)
In[47]: type(barr)
Out[47]: bytearray
In[48]: barr[0] = 110
In[49]: barr
Out[49]: bytearray(b'nbcdd')

二、字节与字符的关系

上面也提到字节跟字符很相近,其实它们是可以相互转化的。字节通过某种编码形式就可以转化为相应的字符。字节通过encode()方法传入编码方式就可以转化为字符,而字符通过decode()方法就可以转化为字节:

In[50]: s = "人生苦短,我用Python"
In[51]: b = s.encode('utf-8')
In[52]: b
Out[52]: b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python'
In[53]: c = s.encode('gb18030')
In[54]: c
Out[54]: b'\xc8\xcb\xc9\xfa\xbf\xe0\xb6\xcc\xa3\xac\xce\xd2\xd3\xc3Python'
In[55]: b.decode('utf-8')
Out[55]: '人生苦短,我用Python'
In[56]: c.decode('gb18030')
Out[56]: '人生苦短,我用Python'
In[57]: c.decode('utf-8')
Traceback (most recent call last):
 exec(code_obj, self.user_global_ns, self.user_ns)
 File "<ipython-input-57-8b50aa70bce9>", line 1, in <module>
 c.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte
In[58]: b.decode('gb18030')
Out[58]: '浜虹???︾???????ython'

我们可以看到用不同的编码方式解析出来的字符和字节的方式是完全不同,如果编码和解码用了不同的编码方式,就会产生乱码,甚至转换失败。因为每种编码方式包含的字节种类数目不同,如上例中的\xc8就超出了utf-8的最大字符。

三、应用

举个最简单的例子,我要爬取一个网页的内容,现在来爬取用百度搜索Python时返回的页面,百度用的是utf-8编码格式,如果不对返回结果解码,那它就是一个超级长的字节串。而进行正确解码后就可以显示一个正常的html页面。

import urllib.request

url = "http://www.baidu.com/s?ie=utf-8&wd=python"
page = urllib.request.urlopen(url)
mybytes = page.read()
encoding = "utf-8"
print(mybytes.decode(encoding))
page.close()

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Python 相关文章推荐
Python实现求最大公约数及判断素数的方法
May 26 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
python多线程同步之文件读写控制
Feb 25 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
python实现图像全景拼接
Mar 27 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
PyTorch: Softmax多分类实战操作
Jul 07 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Python装饰器入门学习教程(九步学习)
Jan 28 #Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 #Python
使用Python写个小监控
Jan 27 #Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 #Python
Python图像灰度变换及图像数组操作
Jan 27 #Python
让python在hadoop上跑起来
Jan 27 #Python
CentOS安装pillow报错的解决方法
Jan 27 #Python
You might like
php读取html并截取字符串的简单代码
2009/11/30 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
php自动获取关键字的方法
2015/01/06 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
两个Javascript小tip资料
2010/11/23 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
php跨域调用json的例子
2013/11/13 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
浅谈python import引入不同路径下的模块
2017/07/11 Python
django2 快速安装指南分享
2018/01/05 Python
Python中logging实例讲解
2019/01/17 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
浅析python函数式编程
2020/09/26 Python
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
银行工作检查书范文
2014/01/31 职场文书
骨干教师个人总结
2015/02/11 职场文书