小能豆

Error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

javascript

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

在上述站点编译“process.py”时发生错误。

python tools/process.py --input_dir data --operation resize --output_dir data2/resize
data/0.jpg -> data2/resize/0.png

Traceback (most recent call last):
  File "tools/process.py", line 235, in <module>
    main()
  File "tools/process.py", line 167, in main
    src = load(src_path)
  File "tools/process.py", line 113, in load
    contents = open(path).read()
  File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

错误原因是什么?Python的版本是3.5.2。


阅读 51

收藏
2024-09-08

共2个答案

小能豆

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 这个错误的翻译是:“UTF-8 编码解码器无法解码位置 0 的字节 0xff:无效的起始字节”。

这个错误通常发生在尝试使用 UTF-8 编码来读取或解码一个不是以 UTF-8 编码的文件时。在这个具体的例子中,错误发生在尝试读取一个图片文件(如 JPEG 或 PNG)时,这些文件通常不是以文本形式存储的,而是使用二进制格式。

在 Python 中,当你使用 open() 函数打开文件而没有指定模式(默认为 ‘r’,即文本模式)时,Python 会尝试使用系统的默认编码(通常是 UTF-8)来读取文件。然而,对于非文本文件(如图片、视频或任何二进制文件),这会导致解码错误,因为二进制数据中的字节序列可能不包含有效的 UTF-8 编码文本。

为了解决这个问题,你应该以二进制模式(’rb’)打开这些文件。例如,如果你的脚本中尝试读取图片文件,你应该这样修改代码:

with open('data/0.jpg', 'rb') as f:  
    contents = f.read()  
    # 现在你可以对 contents 进行进一步处理,比如保存为另一个文件或进行图像处理

这样,Python 就不会尝试将文件内容解码为 UTF-8 文本,而是会将其作为一个字节序列来读取。

2024-09-08
小能豆

Python 尝试将字节数组(bytes它假设为 utf-8 编码的字符串)转换为 unicode 字符串 ( str)。这个过程当然是根据 utf-8 规则进行解码。当它尝试这样做时,它会遇到 utf-8 编码字符串中不允许的字节序列(即位置 0 处的 0xff)。

由于您没有提供任何我们可以查看的代码,因此我们只能猜测其余部分。

从堆栈跟踪中,我们可以假设触发操作是读取文件(contents = open(path).read())。我建议以如下方式重新编码:

with open(path, 'rb') as f:
  contents = f.read()

b中的模式说明符open()规定文件应被视为二进制文件,因此contents将保留为bytes。 这样就不会发生任何解码尝试。

2024-09-08