热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Python3中将字符串转换为字节的最佳方法是什么?

似乎有两种不同的方法可以将字符串转换为字节,如对typeerror的回答所示:str不支持缓冲区接口。这些方法中哪一种比较好或更适合用Python&

似乎有两种不同的方法可以将字符串转换为字节,如对typeerror的回答所示:"str"不支持缓冲区接口。

这些方法中哪一种比较好或更适合用Python?还是只是个人喜好的问题?

b = bytes(mystring, 'utf-8')

b = mystring.encode('utf-8')

使用编码/解码更常见,可能更清晰。

@伦纳特雷格布罗,我解散了。即使它更常见,读取"bytes()"我知道它在做什么,而encode()并不能让我觉得它在编码字节。

@erm3nda这是一个很好的理由来使用它,直到它感觉像这样,那么您就离unicode-zen更近了一步。

@伦纳特雷格布罗,我觉得很好,只要使用bytes(item,"utf8"),因为显式比隐式好,所以…str.encode( )默认默认为字节,使您的zen更为unicode,但不太明显。同样,"普通"也不是我喜欢使用的术语。另外,bytes(item,"utf8")更像str()和b"string"符号。如果我不能理解你的理由,我深表歉意。谢谢您。

@erm3nda如果你读到被接受的答案,你会发现encode()并不叫bytes(),相反。当然,这并不是很明显,这就是我问这个问题的原因。

哦,对不起。无论如何,我所说的也适用于some_string.encode(encoding),例如"string".encode("utf8"),它返回类型字节。对我来说,使用bytes()这个术语更有意义。我倾向于认为编码/解码比数据类型更与字符集相关。再说一次,我可能想得太多了…但我喜欢直白,没有"字节"指的是"some".encode("utf8")。谢谢,我查过str.encode()并没有违约。

@erm3nda在文本上下文中的单词encode的真正含义不包括"to bytes",因为编码文本是提取抽象文本数据并将其转换为实际的具体字节表示?

如果您查看bytes的文档,它会将您指向bytearray:

bytearray(]])

Return a new array of bytes. The bytearray type is a mutable sequence of integers in the range 0 <&#61; x <256. It has most of the usual methods of mutable sequences, described in Mutable Sequence Types, as well as most methods that the bytes type has, see Bytes and Byte Array Methods.

The optional source parameter can be used to initialize the array in a few different ways:

If it is a string, you must also give the encoding (and optionally, errors) parameters; bytearray() then converts the string to bytes using str.encode().

If it is an integer, the array will have that size and will be initialized with null bytes.

If it is an object conforming to the buffer interface, a read-only buffer of the object will be used to initialize the bytes array.

If it is an iterable, it must be an iterable of integers in the range 0 <&#61; x <256, which are used as the initial contents of the array.

Without an argument, an array of size 0 is created.

因此&#xff0c;bytes不仅仅可以对字符串进行编码。它允许您使用任何类型的有意义的源参数调用构造函数&#xff0c;这是pythonic。

对于字符串的编码&#xff0c;我认为some_string.encode(encoding)比使用构造函数更具有派头性&#xff0c;因为它是最自我记录的——"接受这个字符串并用这个编码编码编码"比bytes(some_string, encoding)更清晰——使用构造函数时没有显式动词。

编辑&#xff1a;我检查了python源代码。如果使用cpython将一个unicode字符串传递给bytes&#xff0c;它将调用pyunicode〔u asencodedstring&#xff0c;这是encode的实现&#xff1b;因此&#xff0c;如果您自己调用encode的话&#xff0c;您将跳过一个间接级别。

另外&#xff0c;参见Serdalis的评论——unicode_string.encode(encoding)也更像是Python&#xff0c;因为它的倒数是byte_string.decode(encoding)&#xff0c;对称性也很好。

&#43;1从python文档中获得了良好的参数和引用。当你想要回弦的时候&#xff0c;unicode_string.encode(encoding)和bytearray.decode(encoding)也能很好地匹配。

当需要可变对象时&#xff0c;使用bytearray。你不需要它来做简单的str&#xff1f;bytes转换。

&#64;eugenehomyakov这与bytearray无关&#xff0c;只是bytes的文档没有提供细节&#xff0c;他们只是说"这是bytearray的不变版本"&#xff0c;所以我不得不从那里引用。

简单地说&#xff0c;python关于bytes的一个警告说明&#xff1a;避免使用bytes类型作为带有整数参数的函数。在v2中&#xff0c;这将返回转换为(byte)字符串的整数&#xff0c;因为bytes是str的别名&#xff0c;而在v3中&#xff0c;它返回包含给定数量的空字符的字节字符串。因此&#xff0c;例如&#xff0c;代替v3表达式字节(6)&#xff0c;使用等效的b&#39;x00&#39;*6&#xff0c;它在每个版本中以相同的方式无缝工作。

它比人们想象的要容易&#xff1a;

my_str &#61;"hello world"

my_str_as_bytes &#61; str.encode(my_str)

type(my_str_as_bytes) # ensure it is byte representation

my_decoded_str &#61; my_str_as_bytes.decode()

type(my_decoded_str) # ensure it is string representation

他知道怎么做&#xff0c;他只是在问哪条路更好。请重新阅读问题。

仅供参考&#xff1a;str.decode(bytes)对我不起作用(python 3.3.3说"类型对象"str没有"decode"属性)&#xff0c;而是使用bytes.decode()。

&#64;迈克&#xff1a;用obj.method()语法代替cls.method(obj)语法&#xff0c;即用bytestring &#61; unicode_text.encode(encoding)和unicode_text &#61; bytestring.decode(encoding)语法。

Mike和Shenshin修正了答案中的错误——它现在正为Py3.6工作。

您应该非常小心&#xff0c;因为encode创建字节&#xff0c;但类仍然是str&#xff0c;bytes方法创建字节类。

这个答案对我来说更像是一个评论。这实际上是如何回答这个问题的&#xff1f;

str.encode(my_str)真的应该是my_str.encode()…

…也就是说&#xff0c;不必要地生成一个未绑定的方法&#xff0c;然后调用它&#xff0c;将self作为第一个参数传递给它。

&#64;谁在乎&#xff1f;它可以帮助访问此页面的用户执行此操作

&#64;KolobCanyon这个问题已经显示了正确的方法&#xff0c;它将encode称为字符串上的绑定方法。此答案建议您改为调用未绑定方法并将其传递给字符串。这是答案中唯一的新信息&#xff0c;这是错误的。

绝对最好的方法不是2&#xff0c;而是3。自Python3.0以来&#xff0c;encode的第一个参数默认为&#39;utf-8&#39;。所以最好的办法是

b &#61; mystring.encode()

这也会更快&#xff0c;因为默认参数不会在C代码中产生字符串"utf-8"&#xff0c;而会在C代码中产生字符串NULL&#xff0c;检查速度要快得多&#xff01;

以下是一些时间安排&#xff1a;

In [1]: %timeit -r 10 &#39;abc&#39;.encode(&#39;utf-8&#39;)

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 &#39;abc&#39;.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

尽管有警告&#xff0c;但重复运行后的时间非常稳定——偏差仅为约2%。

在没有参数的情况下使用encode()与python2不兼容&#xff0c;因为在python2中&#xff0c;默认的字符编码是ascii。

>>> &#39;???&#39;.encode()

Traceback (most recent call last):

File"", line 1, in

UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xc3 in position 0: ordinal not in range(128)

这里只有一个相当大的区别&#xff0c;因为(a)字符串是纯ASCII&#xff0c;这意味着内部存储已经是UTF-8版本&#xff0c;所以查找编解码器几乎是唯一涉及的成本&#xff0c;(b)字符串很小&#xff0c;所以即使必须编码&#xff0c;也不会有太大的区别。比如说&#xff0c;用&#39;\u00012345&#39;*10000试试。两个都在我的笔记本电脑上取28.8us&#xff1b;额外的50ns可能会在舍入误差中丢失。当然&#xff0c;这是一个非常极端的例子&#xff0c;但&#39;abc&#39;在相反的方向上也同样极端。

&#64;abarner为true&#xff0c;但即使如此&#xff0c;也没有理由将参数作为字符串传递。

您可以使用以下方法简单地将字符串转换为字节&#xff1a;

a_string.encode()

您可以使用以下方法简单地将字节转换为字符串&#xff1a;

some_bytes.decode()

bytes.decode和str.encode将encoding&#61;&#39;utf-8&#39;作为默认值。

以下函数(取自有效的python)可能有助于将str转换为bytes和bytes转换为str&#xff1a;

def to_bytes(bytes_or_str):

if isinstance(bytes_or_str, str):

value &#61; bytes_or_str.encode() # uses &#39;utf-8&#39; for encoding

else:

value &#61; bytes_or_str

return value # Instance of bytes

def to_str(bytes_or_str):

if isinstance(bytes_or_str, bytes):

value &#61; bytes_or_str.decode() # uses &#39;utf-8&#39; for encoding

else:

value &#61; bytes_or_str

return value # Instance of str

so_string &#61; &#39;stackoverflow&#39;

so_bytes &#61; so_string.encode( )

如果你再读一遍整个问题&#xff0c;你会发现这并不能真正回答它。

尽管此代码可能有助于解决问题&#xff0c;但它不能解释为什么和/或如何回答问题。提供这种额外的背景将显著提高其长期价值。请编辑您的答案以添加解释&#xff0c;包括哪些限制和假设适用。

正如blog.startifact.com/posts/older/what-is-pythonic.html中所解释的&#xff0c;"pythonic"代码很简短&#xff0c;使用标准语言习语&#xff1b;因为我在示例中提供的代码是完成任务的最简单和最直接的方式&#xff0c;就像我希望看到的工作代码编写器一样。我对堆栈溢出的传统假设是&#xff0c;参与者在工作&#xff0c;程序员互相帮助解决问题&#xff0c;而不是对愚蠢的东西吹毛求疵。吸取教训。

我想StackOverflow已经增长了很多…&#xff1a;-)这是不宝贵的学习资源。即使主要目标是程序员…你的回答太懒了。你甚至在解释性评论上比在答案本身上写得更多&#xff1a;—)

有一天&#xff0c;当互联网变得有知觉并开始编码的时候&#xff0c;它将从S.O.学习。即使有惊人的语义理解和自然语言处理&#xff0c;它仍然无法从这样的答案中学习。也许这是件好事。



推荐阅读
author-avatar
关注丑开
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有