我在打开文本文件时遇到此错误编辑在 Ubuntu 22.04 上:
该文件是作为exiftool
(12.57)从 100,000 张照片中提取元数据的命令行:
for photo in $(find "/media/data/photos" -type f \( -iname "*.jpg" -o -iname "*.png" \));
do
exiftool -a -G0 -s -c '%.7f' "${photo}" >> "/media/data/output/processing.txt"
done
我也尝试打开该文件Python3.10.6 但出现了同样的错误:
with open('/media/data/output/processing.txt','r') as f:
data = f.readlines()
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python3.10/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 3107: invalid continuation byte
我怎样才能找出问题所在,如果可能的话,怎样调试它?
編輯
$ file processing.txt
processing.txt: ASCII text
我发现这些诗句查找我的文件中的管道字符:
grep -inr "|" processing.txt
28978:MakerNotes : BabyAge : |.z.�.�.�.�.�.�.�.g.
153969:MakerNotes : BabyAge : �...�.�[email protected].�.|.�.x.
239759:MakerNotes : BabyAge : .�.�.;.|.A.>.Q.=.�.
287018:MakerNotes : BabyAge : �.�.�.|.�.....K.�.5.
466938:MakerNotes : InternalSerialNumber : |.�.x.�\.v.B...
473829:MakerNotes : BabyAge : |.�.�.�...�.X.'.�.X.
475416:MakerNotes : BabyAge : |.�.�.�...�.X.'.�.X.
475777:MakerNotes : BabyAge : 4.�.|.1...P.:...�
477305:MakerNotes : InternalSerialNumber : �.|.r.|.h.�.�.O.
483418:MakerNotes : BabyAge : 6.�.J.c.`.�.H.�.|.�.
557390:MakerNotes : InternalSerialNumber : �.�.�..|.o&.3.
604471:MakerNotes : BabyAge : �.�.|.Q..A.=.9.�.�.
636619:MakerNotes : BabyAge : �.�.N.�.�.�.G.�.|...
799895:MakerNotes : InternalSerialNumber : .|�..�.�`.�.
944200:MakerNotes : BabyAge : �.�.�.|.�.r.�.�...�
答案1
我的第一个建议是尝试使用编辑器 notepadqq,因为当文件存在编码问题(或实际数据错误)时,它不会太挑剔,而且还提供了一些重新编码来对它们进行一些实用的操作。
但最终,特定情况可能还需要:在字节级别进行检查和/或很好地理解字符编码的工作原理。
当然,有用于此的命令行工具,但我注意到,上次处理某些问题时必须安装一个名为 ghex 的程序作为 GUI“十六进制”编辑器。
我不敢说我是这方面的专家,但我确实在Grrr 字符编码
要理解为什么某些字节序列可以无效的对于 UTF-8,您需要了解 Unicode 的概念以及 UTF-8 对其的编码。
我确实也有一些未发表的关于在 Python3 中处理意外字符编码的笔记 - 但上下文是关于文件名,而不是文件内容。在这种情况下,是 os 模块“读取”了编码字符串,然后我可以担心 Python3 如何选择存储和解释它。我还没有需要对读取文件内容做同样的事情。
我希望有办法改变或替换,readlines
以便它能够以有效的编码解释完成工作,或者优雅地处理不符合假定编码的内容。这是 RTFM 领域,但最好在清楚文件中实际包含的内容后再进行。
FWIW - 根据我的经验,最有可能的情况是,您认为的 UTF-8 编码根本不是 - 而这将导致您猜测/尝试它实际上采用哪种编码。处理过时但正常的格式是我写这篇文章的原因 - 尤其是那些来自遵循 Microsoft 破坏惯例的有问题的东西。