在Python 3中将string转换为字节的最佳方法是什么?
似乎有两种不同的方式将string转换为字节,如TypeError的答案中所示:“str”不支持缓冲区接口
哪种方法会更好或者更加Pythonic? 还是只是个人喜好的问题?
b = bytes(mystring, 'utf-8') b = mystring.encode('utf-8')
如果你看看文件的bytes
,它指向你bytearray
:
bytearray([source [,encoding [,errors]]])
返回一个新的字节数组。 bytearraytypes是一个在0 <= x <256范围内的可变整数序列。它具有可变序列的大多数常用方法,在可变序列types中描述,以及字节types具有的大多数方法,请参见字节和字节数组方法。
可选的source参数可以用几种不同的方式初始化数组:
如果是string,则还必须给出编码(以及可选的错误)参数; bytearray()然后使用str.encode()将string转换为字节。
如果它是一个整数,则数组将具有该大小,并将用空字节进行初始化。
如果它是符合缓冲区接口的对象,则将使用该对象的只读缓冲区来初始化字节数组。
如果它是一个可迭代的,它必须是0 <= x <256范围内的整数的迭代,它们被用作数组的初始内容。
没有参数,就会创build一个大小为0的数组。
所以bytes
可以做的不仅仅是编码一个string。 Pythonic会允许你使用任何types的源参数来调用构造函数。
对于一个string的编码,我认为some_string.encode(encoding)
比使用构造函数更Pythonic,因为它是最自我logging – “采取这个string,并用此编码进行编码”比bytes(some_string, encoding)
– 使用构造函数时没有明确的动词。
编辑:我检查了Python的来源。 如果您使用CPython将unicodestring传递给bytes
,则会调用PyUnicode_AsEncodedString ,这是encode
的实现; 所以如果你打电话给自己encode
你只是跳过一个间接的程度。
此外,请参阅Serdalis的评论 – unicode_string.encode(encoding)
也是更Pythonic,因为它的逆是byte_string.decode(encoding)
和对称是好的。
比它想象的更容易:
my_str = "hello world" my_str_as_bytes = str.encode(my_str) type(my_str_as_bytes) # ensure it is byte representation my_decoded_str = my_str_as_bytes.decode() type(my_decoded_str) # ensure it is string representation
绝对最好的办法不是2号,而是3号。 encode
的第一个参数默认为 'utf-8'
。 所以最好的办法是
b = mystring.encode()
这也会更快,因为默认的参数结果不在C代码中的string"utf-8"
中,而是NULL
,它的检查速度要快得多!
这里有一些时机:
In [1]: %timeit -r 10 'abc'.encode('utf-8') The slowest run took 38.07 times longer than the fastest. This could mean that an intermediate result is being cached. 10000000 loops, best of 10: 183 ns per loop In [2]: %timeit -r 10 'abc'.encode() The slowest run took 27.34 times longer than the fastest. This could mean that an intermediate result is being cached. 10000000 loops, best of 10: 137 ns per loop
尽pipe有警告,但经过反复运行后,时间非常稳定 – 偏差仅为〜2%。
so_string = 'stackoverflow' so_bytes = so_string.encode( )
你可以简单地将string转换为字节使用:
a_string.encode()
你可以简单地将字节转换为string使用:
some_bytes.decode()
bytes.decode
和str.encode
encoding='utf-8'
为默认值。
以下函数(取自Effective Python )可能对将str
转换为bytes
并将bytes
转换为str
有用:
def to_bytes(bytes_or_str): if isinstance(bytes_or_str, str): value = bytes_or_str.encode() # uses 'utf-8' for encoding else: value = bytes_or_str return value # Instance of bytes def to_str(bytes_or_str): if isinstance(bytes_or_str, bytes): value = bytes_or_str.decode() # uses 'utf-8' for encoding else: value = bytes_or_str return value # Instance of str