Python 中 UnicodeDecodeError: 'charmap' codec can't decode byte 错误
Python“UnicodeDecodeError: 'charmap' codec can't decode byte in position”发生在我们指定不正确的编码或在打开文件时未显式设置编码关键字参数时。
要解决错误,请指定正确的编码,例如 utf-8
。
下面是错误如何发生的示例。
我有一个名为 example.txt 的文件,其中包含以下内容。
example.txt
𝘈Ḇ𝖢𝕯٤ḞԍНǏ hello world
这是尝试解码 example.txt 内容的代码。
# ⛔️ UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 1: character maps to <undefined>
with open('example.txt', 'r', encoding='cp856') as f:
lines = f.readlines()
print(lines)
错误是因为 example.txt 文件没有使用指定的编码。
打开文件时指定正确的编码
如果我们知道文件使用的编码,请确保使用 encoding
关键字参数指定它。
否则,我们可以尝试的第一件事是将编码设置为 utf-8。
with open('example.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
# ✅ ['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']
print(lines)
utf-8 编码能够在 Unicode 中编码超过一百万个有效字符代码点。
如果我们直接使用 open()
函数而不是使用 with
语句,则可以使用相同的方法。
my_file = open('example.txt', 'r', encoding='utf-8')
lines = my_file.readlines()
print(lines) # ['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']
我们可以在官方文档的此表中查看所有标准编码。
一些常见的编码是 ascii、latin-1 和 utf-32。
忽略无法解码的字符
如果错误仍然存在,我们可以将 errors
关键字参数设置为 ignore 以忽略无法解码的字符。
请注意
,忽略无法解码的字符会导致数据丢失。
# 👇️ set errors to ignore
with open('example.txt', 'r', encoding='utf-8', errors='ignore') as f:
lines = f.readlines()
# ✅ ['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']
print(lines)
使用设置为忽略的错误编码打开文件不会引发 UnicodeDecodeError
。
with open('example.txt', 'r', encoding='cp856', errors='ignore') as f:
lines = f.readlines()
# ✅ ['\xadרט©ז\xadצ\xadץ»┘©×םן\n', 'hello world']
print(lines)
无法解码的字符将被忽略。
以二进制模式打开文件
如果我们不需要与文件内容进行交互,我们可以在不解码的情况下以二进制模式打开它。
with open('example.txt', 'rb') as f:
lines = f.readlines()
# ✅ [b'\xf0\x9d\x98\x88\xe1\xb8\x86\xf0\x9d\x96\xa2\xf0\x9d\x95\xaf\xd9\xa4\xe1\xb8\x9e\xd4\x8d\xd0\x9d\xc7\x8f\n', b'hello world']
print(lines)
我们以二进制模式打开文件(使用 rb - 读取二进制模式),因此行列表包含字节对象。
如果我们需要将文件上传到远程服务器并且不需要对其进行解码,则可以使用这种方法。
编码是将字符串转换为字节对象的过程,解码是将字节对象转换为字符串的过程。
解码字节对象时,我们必须使用与将字符串编码为字节对象相同的编码。
尝试使用 cp437 编码
如果错误依旧,请尝试在打开文件时使用cp437编码。
with open('example.txt', 'r', encoding='cp437') as f:
lines = f.readlines()
# ✅ ['≡¥ÿêß╕å≡¥ûó≡¥ò»┘ñß╕₧╘ì╨¥╟Å\n', 'hello world']
print(lines)
代码页 437 编码是原始 IBM 个人计算机的字符集,包括所有可打印的 ASCII 字符以及一些重音字母。
如果仍然出现错误,请在调用 open()
函数时将 errors 关键字参数设置为 ignore。
with open('example.txt', 'r', encoding='cp437', errors='ignore') as f:
lines = f.readlines()
# ✅ ['≡¥ÿêß╕å≡¥ûó≡¥ò»┘ñß╕₧╘ì╨¥╟Å\n', 'hello world']
print(lines)
无法解码的字符将被忽略,这可能会导致数据丢失。
如果错误仍然存在,请尝试其他编码,例如 utf-16
、utf-32
、latin-1
等。
试图找到文件的编码
我们可以尝试使用 file
命令来弄清楚文件的编码是什么。
该命令在 macOS 和 Linux 上可用,但如果安装了 git 和 Git Bash,也可以在 Windows 上使用。
如果在 Windows 上,请确保在 Git Bash 中运行该命令。
在包含该文件的目录中打开 shell,然后运行以下命令。
file *
屏幕截图显示该文件使用 UTF-8 编码。
这是我们在打开文件时应指定的编码。
with open('example.txt', 'r', encoding='UTF-8') as f:
lines = f.readlines()
print(lines)
使用不同的编码会导致错误
下面是一个示例,展示了如何使用不同的编码将字符串编码为字节而不是用于解码字节对象的编码会导致错误。
my_text = '𝘈Ḇ𝖢𝕯٤ḞԍНǏ'
my_binary_data = my_text.encode('utf-8')
# ⛔️ UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 1: character maps to <undefined>
my_text_again = my_binary_data.decode('cp856')
我们可以通过使用 utf-8 编码解码 bytes 对象来解决错误。
my_text = '𝘈Ḇ𝖢𝕯٤ḞԍНǏ'
my_binary_data = my_text.encode('utf-8')
# 👉️ b'\xf0\x9d\x98\x88\xe1\xb8\x86\xf0\x9d\x96\xa2\xf0\x9d\x95\xaf\xd9\xa4\xe1\xb8\x9e\xd4\x8d\xd0\x9d\xc7\x8f'
print(my_binary_data)
# ✅ specify correct encoding
my_text_again = my_binary_data.decode('utf-8')
print(my_text_again) # 👉️ '𝘈Ḇ𝖢𝕯٤ḞԍНǏ'
总结
Python“UnicodeDecodeError: 'charmap' codec can't decode byte in position”发生在我们指定不正确的编码或在打开文件时未显式设置编码关键字参数时。
要解决错误,请指定正确的编码,例如 utf-8。
相关文章
Python for 循环中的下一项
发布时间:2023/04/26 浏览次数:179 分类:Python
-
本文讨论了 Python 中的 for 循环以及如何通过使用 for 循环和示例来跳过列表的第一个元素。
Python While 循环用户输入
发布时间:2023/04/26 浏览次数:148 分类:Python
-
我们可以在 while 循环中使用 input() 函数来输入数据,直到在 Python 中满足某个条件。
在 Python 中将整数转换为罗马数字
发布时间:2023/04/26 浏览次数:87 分类:Python
-
本篇文章将介绍在 Python 中将整数转换为罗马数字。以下是一个 Python 程序的实现,它将给定的整数转换为其等效的罗马数字。
在 Python 中将罗马数字转换为整数
发布时间:2023/04/26 浏览次数:144 分类:Python
-
本文讨论如何在 Python 中将罗马数字转换为整数。 我们将使用 Python if 语句来执行此操作。 我们还将探讨在 Python 中将罗马数字更改为整数的更多方法。
在 Python 中读取 gzip 文件
发布时间:2023/04/26 浏览次数:70 分类:Python
-
本篇文章强调了压缩文件的重要性,并演示了如何在 Python 中使用 gzip 进行压缩和解压缩。
在 Python 中锁定文件
发布时间:2023/04/26 浏览次数:141 分类:Python
-
本文解释了为什么在 Python 中锁定文件很重要。 这讨论了当两个进程在没有锁的情况下与共享资源交互时会发生什么的示例,为什么在放置锁之前知道文件状态很重要,等等
在 Python 中将 PDF 转换为文本
发布时间:2023/04/26 浏览次数:196 分类:Python
-
在本教程中,我们将学习如何使用 Python 使用 PyPDF2、Aspose 和 PDFminer 将 PDF 文档转换为文本文件。
在 Python 中创建临时文件
发布时间:2023/04/26 浏览次数:53 分类:Python
-
本文讲解了tempfile库函数的四个子函数:TemporaryFile、NamedTemporaryFile、mkstemp、TemporaryDirectory。 每个部分都提供了适当的程序,以简化对概念的理解。