热门标签 | 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;它仍然无法从这样的答案中学习。也许这是件好事。



推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • oracle 数据库正常关闭情况下当前日志损坏的恢复(转) ... [详细]
  • 图片添加二维码水印教程
    本博客介绍一下用jdkawt实现图片加文字水印和图片水印的方法一、图片文字水印原来图片加上文字水印后图片二、图片加图片水印原来图片:水印图片:添加水印后的图片: ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • Ihavebeenworkingwithbufferingafileonmylocaldrivetoparseandobtaincertaindata.Forte ... [详细]
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社区 版权所有