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:38 编辑
指出点小错误:它们 不是 "共用ascii码表",你看见的结果——只是打印显示的不同而已,并非实际存储的数据。
显然我们不会去看二进制数据,故就有了"字节码数据对象",以便对二进制数据进行"封装"和查看,
Python的打印字节码数据对象的结果前面带有 b 标志,最基本的字母字符和标点符号可以直观地看见,如 b'ABC.!$%}',其他字符(不管是不是中文)则显示为b'\x...' 的十六进制表示。
ASCII只是一种编码方式(把人看的一般字符转为计算存储的二进制格式),它是计算机最初的一种编码,只支持128个字符和控制符(不可见的)。
后来的其他各种编码方式(规范),同样也是把一般的字符或控制符,转为二进制的一套套规则。最常见的如 utf-8, gbk等
相比ASCII不是它们的关系不是"共用",而是"扩展支持"——能把更多字符转换而特定的二进制来实现存储。
最重要的:用一种特定的编码进行 编码encode()后 的二进制数据, 通常不能用另一种编码来 解码decode(), 因为它们不完全兼容,或完全不兼容。
希望大佬讲讲消除浮点数误差的方法{:10_254:} 感谢分享! louxinghao 发表于 2021-8-19 17:25
希望大佬讲讲消除浮点数误差的方法
浮点数的误差永远都存在的吧,你咋消除?
只能是 根据需要选择合适的、足够的精度,即可。
又或者你具体指什么,怎么个消除法? 学到了 阿奇_o 发表于 2021-8-19 17:18
指出点小错误:它们 不是 "共用ascii码表",你看见的结果——只是打印显示的不同而已,并非实际存储的数据 ...
谢谢大佬指出{:10_297:} louxinghao 发表于 2021-8-19 17:25
希望大佬讲讲消除浮点数误差的方法
如同一楼大佬所讲,我也搞不了 {:10_275:} {:5_109:} python怎么四舍五入 赚鱼币好做作业 66666666 感谢分享! {:10_261:} lgh202020 发表于 2021-8-19 23:53
python怎么四舍五入
这个好像没有专门的函数,要自己去写的
赚鱼币好做作业 大马强 发表于 2021-8-20 09:11
这个好像没有专门的函数,要自己去写的
哦 学习 学习了
页:
[1]
2