大马强 发表于 2021-8-19 16:36:28

str与bytes

本帖最后由 大马强 于 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参数
五、学习中,待补充和完善

阿奇_o 发表于 2021-8-19 17:18:57

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

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

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

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

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


louxinghao 发表于 2021-8-19 17:25:45

希望大佬讲讲消除浮点数误差的方法{:10_254:}

hornwong 发表于 2021-8-19 17:29:05

感谢分享!

阿奇_o 发表于 2021-8-19 17:41:42

louxinghao 发表于 2021-8-19 17:25
希望大佬讲讲消除浮点数误差的方法

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

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

又或者你具体指什么,怎么个消除法?

让记忆定格 发表于 2021-8-19 17:44:02

学到了

大马强 发表于 2021-8-19 17:47:20

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

谢谢大佬指出{:10_297:}

大马强 发表于 2021-8-19 17:48:08

louxinghao 发表于 2021-8-19 17:25
希望大佬讲讲消除浮点数误差的方法

如同一楼大佬所讲,我也搞不了

noah-py 发表于 2021-8-19 19:32:39

{:10_275:}

fxj2002 发表于 2021-8-19 19:44:06

{:5_109:}

lgh202020 发表于 2021-8-19 23:53:57

python怎么四舍五入

trolwy 发表于 2021-8-20 08:13:57

赚鱼币好做作业

不大不小甲鱼 发表于 2021-8-20 08:29:32

66666666

Rebecca2021 发表于 2021-8-20 08:36:02

感谢分享!

lgh202020 发表于 2021-8-20 08:50:39

{:10_261:}

大马强 发表于 2021-8-20 09:11:55

lgh202020 发表于 2021-8-19 23:53
python怎么四舍五入

这个好像没有专门的函数,要自己去写的

hibeanbean 发表于 2021-8-20 09:12:25


赚鱼币好做作业

lgh202020 发表于 2021-8-20 09:20:13

大马强 发表于 2021-8-20 09:11
这个好像没有专门的函数,要自己去写的

burntlime 发表于 2021-8-20 20:16:44

学习

937135952 发表于 2021-8-25 08:08:42

学习了
页: [1] 2
查看完整版本: str与bytes