鱼C论坛

 找回密码
 立即注册
查看: 3987|回复: 26

[技术交流] str与bytes

[复制链接]
发表于 2021-8-19 16:36:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 大马强 于 2021-8-19 17:45 编辑

最近在做爬网易云评论获取那两参数时接触到的,查了点资料结合自己的理解分享给各位鱼油
由于是偏新手向的理解,如有不对的欢迎指出
一、什么是 str 和 bytes
1.str 字符串 一堆经过计算机处理的01001二进制比特流,给看的
2.bytes 字节串 以二进制形式存放在计算机中的比特流,给计算机看
  对于一些英文字符只要是在ascii码表上,它们显示都是一样的,唯一区别是前边有个 b 做前缀,而汉字字符则以16进制形式显示。(修改:二者公用ascii表)
二、两者的转换
1.str -> bytes : str.encode(encoding), bytes(str, encoding)
字符串通过编码变为字节串,通过字符串的encode方法,一般常用的编码格式utf-8,gbk,默认编码的格式为utf-8
还有通过内置函数bytes(str, encoding)

2.bytes -> str : bytes.decode(decoding), str(bytes, decoding)
字节串通过解码变为字符串,通过字节串的decode方法,一般常用的解码格式utf-8,gbk,默认解码的格式为utf-8
还有通过内置函数str(bytes, encoding)

用utf-8编码和gbk编码得到的字节串是不一样的,在utf-8中一个汉字占3个字节,而在gbk中才占两个字节,bytes()在处理字符串是encoding是不能省的
对于汉字来说,编码时候用什么是格式,解码也一定要用什么格式,如果使用str来解码, encoding一定要写

三、两者转换的代码案例

  1. # 创建三个类型的字符串,并且打印
  2. a1 = "马强"
  3. a2 = "maqiang"
  4. a3 = "123@#"
  5. print(type(a1), a1)
  6. print(type(a2), a2)
  7. print(type(a3), a3)
  8. """
  9. 输出
  10. <class 'str'> 马强
  11. <class 'str'> maqiang
  12. <class 'str'> 123@#
  13. """

  14. # 将其转变为字节串
  15. b1 = a1.encode()    # bytes(a1,"utf-8")
  16. b2 = a2.encode()    # bytes(a2,"utf-8")
  17. b3 = a3.encode("gbk")    # bytes(a3,"utf-8")
  18. # 用bytes转换encoding不能省
  19. print(type(b1), b1)
  20. print(type(b2), b2)
  21. print(type(b3), b3)
  22. """
  23. 输出
  24. <class 'bytes'> b'\xe9\xa9\xac\xe5\xbc\xba'
  25. <class 'bytes'> b'maqiang'
  26. <class 'bytes'> b'123@#'
  27. """
  28. # 将其转变回字符串
  29. c1 = str(b1, "utf-8")  # b1.decode("utf-8") , encoding 一定要加 且与编码时相同
  30. c2 = str(b2, "utf-8")  # b2.decode("utf-8")
  31. c3 = str(b3, "utf-8")  # b3.decode("utf-8") encoding 一定要加 且可以与编码时不相同

  32. print("c1", type(c1), c1)
  33. print("c2", type(c2), c2)
  34. print("c3", type(c3), c3)
  35. """
  36. 输出1 - 加都加encoding
  37. c1 <class 'str'> 马强
  38. c2 <class 'str'> maqiang
  39. c3 <class 'str'> 123@#
  40. 输出2 - 都不加 encoding
  41. c1 <class 'str'> b'\xe9\xa9\xac\xe5\xbc\xba'
  42. c2 <class 'str'> b'maqiang'
  43. c3 <class 'str'> b'123@#'
  44. """
复制代码

四、其他补充
1.两者的内置方法几乎一样,不同的是str有encode,bytes有的decode,所以下面是我进行拼接操作得出的结果
  1. print(a1+a2)  # 同str
  2. print(a1+b2)  # 不同
  3. print(b1+b2)  # 同bytes
  4. print(b1+b3)  # 不同编码

  5. """
  6. 输出
  7. 马强maqiang
  8. 报错 can only concatenate str (not "bytes") to str
  9. b'\xe9\xa9\xac\xe5\xbc\xbamaqiang'
  10. b'\xe9\xa9\xac\xe5\xbc\xba123@#'
  11. """
复制代码

2.bytes()这个内置函数不能对浮点数经行操作,编码整数时不能添加encoding参数
五、学习中,待补充完善
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-19 17:18:57 | 显示全部楼层

回帖奖励 +10 鱼币

本帖最后由 阿奇_o 于 2021-8-19 17:38 编辑

指出点小错误:它们 不是 "共用ascii码表",你看见的结果——只是打印显示的不同而已,并非实际存储的数据。

显然我们不会去看二进制数据,故就有了"字节码数据对象",以便对二进制数据进行"封装"和查看,
Python的打印字节码数据对象的结果前面带有 b 标志,最基本的字母字符和标点符号可以直观地看见,如 b'ABC.!$%}',其他字符(不管是不是中文)则显示为b'\x...' 的十六进制表示。

ASCII只是一种编码方式(把人看的一般字符转为计算存储的二进制格式),它是计算机最初的一种编码,只支持128个字符和控制符(不可见的)。
后来的其他各种编码方式(规范),同样也是把一般的字符或控制符,转为二进制的一套套规则。最常见的如 utf-8, gbk等
相比ASCII不是它们的关系不是"共用",而是"扩展支持"——能把更多字符转换而特定的二进制来实现存储。

最重要的:用一种特定的编码进行 编码encode()后 的二进制数据, 通常不能用另一种编码来 解码decode()  , 因为它们不完全兼容,或完全不兼容。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 17:25:45 | 显示全部楼层

回帖奖励 +10 鱼币

希望大佬讲讲消除浮点数误差的方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 17:29:05 | 显示全部楼层

回帖奖励 +10 鱼币

感谢分享!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 17:41:42 | 显示全部楼层
louxinghao 发表于 2021-8-19 17:25
希望大佬讲讲消除浮点数误差的方法

浮点数的误差永远都存在的吧,你咋消除?  

只能是 根据需要选择合适的、足够的精度,即可。

又或者你具体指什么,怎么个消除法?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 17:44:02 | 显示全部楼层

回帖奖励 +10 鱼币

学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-19 17:47:20 | 显示全部楼层
阿奇_o 发表于 2021-8-19 17:18
指出点小错误:它们 不是 "共用ascii码表",你看见的结果——只是打印显示的不同而已,并非实际存储的数据 ...

谢谢大佬指出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-19 17:48:08 | 显示全部楼层
louxinghao 发表于 2021-8-19 17:25
希望大佬讲讲消除浮点数误差的方法

如同一楼大佬所讲,我也搞不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-19 19:32:39 | 显示全部楼层

回帖奖励 +10 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-19 19:44:06 | 显示全部楼层

回帖奖励 +10 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-19 23:53:57 | 显示全部楼层

回帖奖励 +10 鱼币

python怎么四舍五入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 08:13:57 | 显示全部楼层

回帖奖励 +10 鱼币

赚鱼币好做作业
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 08:29:32 | 显示全部楼层

回帖奖励 +10 鱼币

66666666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 08:36:02 | 显示全部楼层

回帖奖励 +10 鱼币

感谢分享!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 08:50:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-20 09:11:55 | 显示全部楼层
lgh202020 发表于 2021-8-19 23:53
python怎么四舍五入

这个好像没有专门的函数,要自己去写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 09:12:25 | 显示全部楼层

回帖奖励 +10 鱼币


赚鱼币好做作业
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 09:20:13 | 显示全部楼层
大马强 发表于 2021-8-20 09:11
这个好像没有专门的函数,要自己去写的

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 20:16:44 | 显示全部楼层

回帖奖励 +10 鱼币

学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-25 08:08:42 | 显示全部楼层

回帖奖励 +10 鱼币

学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表