迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

如何在 Python 2 和 Python 3 中将字节转换为字符串

作者:迹忆客 最近更新:2023/02/28 浏览次数:

我们将来介绍将如何在 Python 2.x 和 Python 3.x 中将 bytes 转换为字符串。

Python 2.7 中的 bytes 等同于 str,因此 bytes 变量本身就是字符串。

Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
'cd'
>>> type(A)
<type 'str'>

bytes 是 Python 3 中引入的新数据类型。

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
b'cd'
>>> type(A)
<class 'bytes'>
>>> 

bytes 中的元素的数据类型为 int

>>> A = b'cd'
>>> A[0]
99
>>> type(A[0])
<class 'int'>

bytesdecode 方法可以使用给定的 encoding 将字节转换为字符串。在大多数情况下,如果将 encoding 方法没有被指定,那默认设置是 utf-8。但它并非总是安全的,因为字节可以使用其他的不同于 utf-8 的编码方法进行编码。

>>> b'\x50\x51'.decode()
'PQ'
>>> b'\x50\x51'.decode('utf-8')
'PQ'
>>> b'\x50\x51'.decode(encoding = 'utf-8')
'PQ'

如上所示,三种对 bytes 的解码方式得到的结果相同,因为它们都是用 utf-8 作编码方法。

如果 bytes 不是用 utf-8 编码,但你用 utf-8 解码的话,系统会报 UnicodeDecodeError 错误。

>>> b'\x50\x51\xffed'.decode('utf-8')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    b'\x50\x51\xffed'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte

我们有两种方法可以解决此类 encoding 问题。

decodeencoding 外,还有另一个参数 errors。它定义了 error 事件发生时的行为。默认值 errorsstrict,这意味着如果在解码过程中发生错误,则会抛出错误。

error 还有其他选项,如 ignorereplace 或其他注册的 codecs.register_error 名称,比如 backslashreplace

ignore 忽略错误的解码错误,并尽可能创建输出字符串。

replaceencoding 给定方法中定义的字符替换相应的字符。backslashreplace 用与原始 bytes 内容相同的内容替换无法解码的字符。

>>> b'\x50\x51\xffed'.decode('utf-8', 'backslashreplace')
'PQ\\xffed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'ignore')
'PQed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'replace')
'PQ�ed'

如果 bytes 数据的编码未知,则可以使用 MS-DOS cp437 编码。

>>> b'\x50\x51\xffed'.decode('cp437')
'PQ\xa0ed'

chr(i, /) 返回一个包含一个序号的字符的 Unicode 字符串,它可以将 bytes 的单个元素转换为 string,而不是转换整个 bytes

我们可以使用列表推导或 map,用 chr 来获取 bytes 单个元素转换成的字符,从而得到整个转换后的字符串。

>>> A =  b'\x50\x51\x52\x53'
>>> "".join([chr(_) for _ in A])
'PQRS'
>>> "".join(map(chr, A))
'PQRS'

我们用 timeit 来比较本教程中介绍的方法- decodechr 的性能。

>>> import timeit
>>> timeit.timeit('b"\x50\x51\x52\x53".decode()', number=1000000)
0.1356779
>>> timeit.timeit('"".join(map(chr, b"\x50\x51\x52\x53"))', number=1000000)
0.8295201999999975
>>> timeit.timeit('"".join([chr(_) for _ in b"\x50\x51\x52\x53"])', number=1000000)
0.9530071000000362

从上面显示的时间性能中可以看出,decode() 它要比 chr() 快得多。chr() 效率相对较低,因为它需要从单个字符串字符中重建字符串。

我们建议在性能重要的应用程序中使用 decode

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便