鱼C论坛

 找回密码
 立即注册
查看: 3364|回复: 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一定要写

三、两者转换的代码案例
# 创建三个类型的字符串,并且打印
a1 = "马强"
a2 = "maqiang"
a3 = "123@#"
print(type(a1), a1)
print(type(a2), a2)
print(type(a3), a3)
"""
输出 
<class 'str'> 马强
<class 'str'> maqiang
<class 'str'> 123@#
"""

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

print("c1", type(c1), c1)
print("c2", type(c2), c2)
print("c3", type(c3), c3)
"""
输出1 - 加都加encoding
c1 <class 'str'> 马强
c2 <class 'str'> maqiang
c3 <class 'str'> 123@#
输出2 - 都不加 encoding
c1 <class 'str'> b'\xe9\xa9\xac\xe5\xbc\xba'
c2 <class 'str'> b'maqiang'
c3 <class 'str'> b'123@#'
"""
四、其他补充
1.两者的内置方法几乎一样,不同的是str有encode,bytes有的decode,所以下面是我进行拼接操作得出的结果
print(a1+a2)  # 同str
print(a1+b2)  # 不同
print(b1+b2)  # 同bytes
print(b1+b3)  # 不同编码

"""
输出
马强maqiang
报错 can only concatenate str (not "bytes") to str
b'\xe9\xa9\xac\xe5\xbc\xbamaqiang'
b'\xe9\xa9\xac\xe5\xbc\xba123@#'
"""
2.bytes()这个内置函数不能对浮点数经行操作,编码整数时不能添加encoding参数
五、学习中,待补充完善
想知道小甲鱼最近在做啥?请访问 -> 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()  , 因为它们不完全兼容,或完全不兼容。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

希望大佬讲讲消除浮点数误差的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

又或者你具体指什么,怎么个消除法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢大佬指出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如同一楼大佬所讲,我也搞不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +10 鱼币

python怎么四舍五入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

赚鱼币好做作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

66666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 08:50:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这个好像没有专门的函数,要自己去写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币


赚鱼币好做作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +10 鱼币

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 13:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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