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



推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 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社区 版权所有