迹忆客 专注技术分享

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

Python 错误 UnicodeDecodeError: ASCII Codec Can't Decode Byte in Position: Ordinal Not in Range

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

在本文中,我们将学习如何解决在代码执行期间发生的 UnicodeDecodeError。 我们将查看导致此错误的不同原因。

我们还将找到在 Python 中解决此错误的方法。 让我们从 Python 中的 UnicodeDecodeError 开始。


Python 中的 Unicode 解码错误

如果您遇到反复出现的 UnicodeDecodeError 并且不确定它发生的原因或如何解决它,那么这篇文章适合您。

在本文中,我们将深入探讨出现此错误的原因以及解决该错误的简单方法。

Python中Unicode解码错误的原因

在 Python 中,当我们使用一种编解码器尝试解码甚至没有使用该编解码器编码的字节时,就会出现 UnicodeDecodeError。 更具体地说,让我们借助锁和钥匙的类比来理解这个问题。

假设我们创建了一把锁,只能使用专为该锁制作的唯一钥匙打开。

当您尝试使用不是为这把锁制作的钥匙打开这把锁时会发生什么? 它不适合。

让我们创建包含以下内容的文件 example.txt。

𝘈Ḇ𝖢𝕯٤ḞԍНǏ
hello world

让我们尝试使用以下代码使用 ascii 编解码器解码此文件。

示例 1:

with open('example.txt', 'r', encoding='ascii') as f:
    lines = f.readlines()
    print(lines)

代码的输出:

Traceback (most recent call last):
  File "/home/jiyik/PycharmProjects/examples/main.py", line 2, in <module>
    lines = f.readlines()
  File "/usr/lib/python3.10/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

让我们看另一个更直接的示例,说明当您使用一种编解码器对字符串进行编码并使用不同的编解码器进行解码时会发生什么。

示例 2:

string = '𝘈Ḇ𝖢𝕯٤ḞԍНǏ'
encoded_string = string.encode('utf-8')
decoded_string = encoded_string.decode('ascii')
print(decoded_string)

在这个例子中,我们有一个使用 utf-8 编解码器编码的字符串,在下一行中,我们尝试使用 ascii 编解码器解码这个字符串。

代码的输出:

Traceback (most recent call last):
  File "/home/jiyik/PycharmProjects/examples/main.py", line 4, in <module>
    decoded_string = encoded_string.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

发生这种情况是因为示例 1 中的文件内容和示例 2 中的字符串未使用 ascii 编解码器编码,但我们尝试使用它解码这些脚本。 这会导致 UnicodeDecodeError


Python中Unicode解码错误如何解决

解决这个问题相当简单。 如果我们研究 Python 的文档,我们将看到几个可用于帮助您解码字节的标准编解码器。

因此,如果我们将上面示例代码中的 ascii 替换为 utf-8 编解码器,它将成功解码 example.txt 中的字节。

示例代码:

with open('example.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    print(lines)

代码的输出:

['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']

至于第二个例子,你只需要做同样的事情。

示例代码:

string = '𝘈Ḇ𝖢𝕯٤ḞԍНǏ'
encoded_string = string.encode('utf-8')
decoded_string = encoded_string.decode('utf-8')
print(decoded_string)

代码的输出:

𝘈Ḇ𝖢𝕯٤ḞԍНǏ

值得一提的是,有时使用一种编解码器可能无法完全解码字符串。

因此,如果需要,您可以通过简单地添加 ignore 参数来开发您的程序以忽略它无法解码的任何字符,如下所示:

with open('example.txt', 'r', encoding='utf-8', errors='ignore') as f:
    lines = f.readlines()
    print(lines)

虽然这将跳过编译器在解码某些字符时遇到的任何错误,但重要的是要提到这可能会导致数据丢失。

我们希望您发现本文有助于理解如何解决 Python 中的 UnicodeDecodeError

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

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便