其他
Python高能小技巧:了解bytes与str的区别
导读:Python有两种类型可以表示字符序列:一种是bytes,另一种是str。
a = b'h\x65llo'
print(list(a))
print(a)
>>>
[104, 101, 108, 108, 111]
b'hello'
a = 'a\u0300 propos'
print(list(a))
print(a)
>>>
['a', '`', ' ', 'p', 'r', 'o', 'p', 'o', 's']
à propos
要把Unicode数据转换成二进制数据,必须调用str的encode方法。 要把二进制数据转换成Unicode数据,必须调用bytes的decode方法。
开发者需要操作原始的8位值序列,序列里面的这些8位值合起来表示一个应该按UTF-8或其他标准编码的字符串。 开发者需要操作通用的Unicode字符串,而不是操作某种特定编码的字符串。
def to_str(bytes_or_str):
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
else:
value = bytes_or_str
return value # Instance of str
print(repr(to_str(b'foo')))
print(repr(to_str('bar')))
>>>
'foo'
'bar'
def to_bytes(bytes_or_str):
if isinstance(bytes_or_str, str):
value = bytes_or_str.encode('utf-8')
else:
value = bytes_or_str
return value # Instance of bytes
print(repr(to_bytes(b'foo')))
print(repr(to_bytes('bar')))
print(b'one' + b'two')
print('one' + 'two')
>>>
b'onetwo'
onetwo
b'one' + 'two'
>>>
Traceback ...
TypeError: can't concat str to bytes
'one' + b'two'
>>>
Traceback ...
TypeError: can only concatenate str (not "bytes") to str
assert b'red' > b'blue'
assert 'red' > 'blue'
assert 'red' > b'blue'
assert b'blue' < 'red'
print(b'foo' == 'foo')
>>>
False
print(b'red %s' % b'blue')
print('red %s' % 'blue')
>>>
b'red blue'
red blue
print(b'red %s' % 'blue')
print('red %s' % b'blue')
>>>
red b'blue'
with open('data.bin', 'w') as f:
f.write(b'\xf1\xf2\xf3\xf4\xf5')
>>>
Traceback ...
TypeError: write() argument must be str, not bytes
with open('data.bin', 'wb') as f:
f.write(b'\xf1\xf2\xf3\xf4\xf5')
with open('data.bin', 'r') as f:
data = f.read()
with open('data.bin', 'rb') as f:
data = f.read()
assert data == b'\xf1\xf2\xf3\xf4\xf5'
with open('data.bin', 'r', encoding='cp1252') as f:
data = f.read()
assert data == 'ñòóôõ'
bytes包含的是由8位值所组成的序列,str包含的是由Unicode码点所组成的序列。 我们可以编写辅助函数来确保程序收到的字符序列确实是期望要操作的类型(要知道自己想操作的到底是Unicode码点,还是原始的8位值。用UTF-8标准给字符串编码,得到的就是这样的一系列8位值)。 bytes与str这两种实例不能在某些操作符(例如>、==、+、%操作符)上面混用。 从文件中读取二进制数据(或者把二进制数据写入文件)时,应该用'rb'('wb')这样的二进制模式打开文件。 如果要从文件中读取(或者要写入文件之中)的是Unicode数据,那么必须注意系统默认的文本编码方案。若无法肯定,可通过encoding参数明确指定。
关于作者:布雷特·斯拉特金(Brett Slatkin),Google首席软件工程师,他是Google Surveys的联合技术创始人,也是PubSubHubbub协议的共同创造者之一。此外,Slatkin还发布了Google的第一个云计算产品——App Engine。早在15年前,Slatkin就开始在工作中使用Python管理Google大量的服务器群。他拥有纽约哥伦比亚大学计算机工程专业学士学位。
本文摘编自《Effective Python:编写高质量Python代码的90个有效方法》(原书第2版),经出版方授权发布。
延伸阅读《Effective Python》(原书第2版)
点击上图了解及购买
转载请联系微信:DoctorData
推荐语:Python编程进阶必读,基于Python3.8,新增31条建议!掌握Pythonic编程方式,写出高质量代码|进阶到编程高手的程序员修炼之道和代码整洁之道。
更多精彩👇