Python bytes 是不可变的字节序列类型,专门用来存储原始二进制数据,和 str 字符串有本质区别,str 是 Unicode 字符,bytes 是单个字节数值,范围限定在 0 到 255,很多新手做网络传输文件读写的时候,经常混淆 str 和 bytes,导致编码报错,bytes 不能直接修改里面单个元素,需要改动的时候一般转成 bytearray 可变字节数组,创建的时候第一步确定数据源,第二步选择创建方式,第三步处理编码转换,第四步进行切片索引,第五步完成二进制读写或者网络通信,掌握 pythonbytes 类型,是做爬虫 socket 二进制文件处理必备知识点。
一 pythonbytes 核心定义
bytes 里面每一个元素都是 0 到 255 的整数,对象创建之后内容固定,不能原地修改,属于不可变序列,支持索引切片迭代,和 list 用法相似,但是元素只能是字节数值。
字面量写法是前面加 b 前缀,例如 b hello,注意 b 前缀里面的字符默认是 ASCII,非 ASCII 中文不能直接写在 b 引号里面,必须通过编码生成。
二 pythonbytes 创建方式
| 创建方式 | 语法示例 | 说明 |
|---|---|---|
| 字面量创建 | b abc | 仅支持 ASCII 字符 |
| str 编码转换 | 字符串.encode utf8 | 最常用,把字符串转 pythonbytes |
| 整数序列构造 | bytes([65,66,67]) | 传入 0 到 255 整数列表 |
| 零填充构造 | bytes(10) | 生成 10 个全 0 字节 |
三 pythonbytes 与 str 对比表
| 对比项目 | pythonbytes | str 字符串 |
|---|---|---|
| 本质 | 原始二进制字节 | Unicode 字符 |
| 前缀 | b | 无 |
| 编码 | 本身不带编码 | 本身是 Unicode |
| 转换 | encode 得到 bytes | decode 把 bytes 转回 str |
| 适用场景 | 网络传输 文件二进制读写 | 文本展示 |
四 深度技术要点
1 pythonbytes 是不可变,不能写 data [0] = 97,执行会报错,如果需要可变字节序列,使用 bytearray,bytearray 支持原地修改,和 pythonbytes 可以互相转换
2 编码转换必须指定编码,中文场景绝大多数使用 utf8,同样 pythonbytes 解码的时候编码必须匹配,编码不匹配会抛出 UnicodeDecodeError
3 索引读取 pythonbytes,得到的是整数,不是字符,例如 b abc 索引 0 取出结果是 97,不是 a,这点非常容易踩坑
4 pythonbytes 支持切片,切片之后仍然返回新的 pythonbytes 对象,不会改变原对象
5 网络 socket 接口返回的数据类型默认就是 pythonbytes,读取图片音频文件 rb 模式打开,读出来的数据也是 pythonbytes
6 拼接 pythonbytes 使用加号,大量拼接性能差,大批量拼接推荐使用 join 方法,和字符串 join 逻辑类似
五 常用操作清单
1 字符串转 pythonbytes s.encode utf8
2 pythonbytes 转回字符串 data.decode utf8
3 索引读取单个字节值 data [0]
4 切片截取部分字节 data [1:4]
5 拼接多个 pythonbytes b1 + b2
6 转换可变字节数组 bytearray (data)
六 常见踩坑说明
1 中文直接写 b 中文 会语法报错,必须 encode 编码生成 pythonbytes
2 忘记 decode,直接打印 pythonbytes,控制台会显示 b 前缀,很多人误以为是乱码
3 编码不一致,utf8 编码生成的 pythonbytes,用 gbk 解码直接报错
4 尝试修改 pythonbytes 单个字节,触发不可变类型异常
【常见问题】
问题 1 pythonbytes 和 str 有什么区别
回答 1 pythonbytes 是二进制字节序列,str 是 Unicode 文本,pythonbytes 需要 decode 才能变成 str,str 通过 encode 生成 pythonbytes,网络和二进制文件操作必须使用 pythonbytes
问题 2 pythonbytes 可以修改里面单个字节吗
回答 1 pythonbytes 属于不可变类型,不能直接修改单个字节,pythonbytes 如果需要修改,可以转成 bytearray 可变字节数组,修改完成之后再转回 pythonbytes
问题 3 pythonbytes 索引取值为什么是数字
回答 1 pythonbytes 每一个元素本质就是 0 到 255 整数,pythonbytes 索引读取得到整数,不是字符,如果需要字符要通过 chr 函数转换
问题 4 pythonbytes 中文怎么创建
回答 1 pythonbytes 中文不能直接加 b 前缀,pythonbytes 正确做法是中文字符串调用 encode,指定 utf8 编码,生成对应的 pythonbytes 字节对象
【免责申明】
本文 pythonbytes 相关内容基于 Python 标准语法编写,不同 Python 版本行为基本一致,特殊第三方二进制库请以官方文档为准,本内容仅作技术参考,不对编码转换业务异常承担责任。
本文来自作者[人间知微笺]投稿,不代表启知新能源网立场,如若转载,请注明出处:https://www.qzdaily.com.cn/shbk/202611/7276.html
评论列表(4条)
我是启知新能源网的签约作者“人间知微笺”!
希望本篇文章《pythonbytes 字节对象基础与深度用法》能对你有所帮助!
本站[启知新能源网]内容主要涵盖:光伏,风电,储能,氢能,户用光伏,家用光伏,光伏投资,光伏新闻,光伏政策,太阳能,多晶硅,逆变器,太阳能电池,光热,组件
本文概览:Python bytes 是不可变的字节序列类型,专门用来存储原始二进制数据,和 str 字符串有本质区别,str 是 Unicode 字符,bytes 是单个字节数值,范围限定在 0 到 255,很多新手做网络传输文件读写的时候,经常混淆 str 和 bytes,导致编码报错,bytes 不能直接修改里面单个元素,需要改动的时候一般转成 bytearray 可变字节数组,创建的时候第一步确定数据源,第二步选择创建方式,第三步处理编码转换,第四步进行切片索引,第五步完成二进制读写或者网络通信,掌握 pythonbytes 类型,是做爬虫 socket 二进制文件处理必备知识点。