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



推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • JavaScript中属性节点的类型及应用
    本文深入探讨了JavaScript中属性节点的不同类型及其在实际开发中的应用,帮助开发者更好地理解和处理HTML元素的属性。通过具体的案例和代码示例,我们将详细解析如何操作这些属性节点。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文讨论了如何根据特定条件动态显示或隐藏文件上传控件中的默认文本(如“未选择文件”)。通过结合CSS和JavaScript,可以实现更灵活的用户界面。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
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社区 版权所有