错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xff:无效的起始字节


162

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

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

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

追溯(最近一次通话):

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。

Answers:


194

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。这样不会发生任何解码尝试。


我收到错误消息“ ValueError:模式字符串必须以'r','w','a'或'U'而不是'br'之一开头”
Unnikrishnan

3
@Unnikrishnan好的,然后使用rb(我认为顺序并不重要,但至少在某些系统/版本中似乎如此)。我相应地更改了答案。
Alfe

57
byte 0xff in position 0也可能意味着文件以UTF-16编码,那么您可以with open(path, encoding='utf-16') as f:改用
Nikolai R Kristiansen

如果0xff位置上实际上没有字符0怎么办?并且它被UTF-8编码。
Iulian Onofrei

'\xFF'字符将在UTF-8中编码为'\xC3\xBF'。UTF-8使用两个字符通过一组MSB编码所有字符。(请参见printf "\xff" | iconv -f latin1 -t utf-8 | xxdshell中的输出。)'\xFF'UTF-8编码的字符串开头的逐字记录是一种编码错误(就UTF-8而言,可以称为语法错误)。
Alfe

83

使用此解决方案,它将去除(忽略)字符并返回不包含字符的字符串。仅当您需要剥离它们而不转换它们时才使用此方法。

with open(path, encoding="utf8", errors='ignore') as f:

使用errors='ignore' 您只会丢失一些字符。但如果您不关心它们,因为它们似乎是多余的字符,这些字符来自与我的套接字服务器连接的客户端的格式和编程不正确。然后,这是一个简单的直接解决方案。 参考


6
同样适用于decode():contents = contents.decode('utf-8', 'ignore')来源:docs.python.org/3/howto/unicode.html#the-string-type
naaman

2
应该是最好的答案
Statham,

我用例中的最佳解决方案:)
maestromusica '19

当您说“丢失一些字符”时,您是说不会读取有错误的文件?还是不是该文件的所有内容都会被读取?
msoutopico

@msoutopico由于忽略了错误,因此将无法读取某些导致问题的编码。但是从来没有遇到阅读时被跳过的任何内容。因此,基本上忽略了编码问题。
Nitish Kumar Pal

23

发生了与此类似的问题,最终使用UTF-16进行解码。我的代码如下。

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

这会将文件内容作为导入,但是它将以UTF格式返回代码。从那里开始,它将被解码并以行分隔。


10
在Python 3中,您可以通过使用编码参数来简化此操作with open(path, encoding='utf-16') as f
Nikolai R Kristiansen

@NikolaiRKristiansen我尝试使用您的方法,但出现错误TypeError: an integer is required (got type str)。为什么?这两个文件都是二进制文件,读为rb
波哥大

1
@Bogota该encoding参数仅在阅读文本时才有意义。从模式参数中删除“ b”,然后重试。在文档中了解更多信息:docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen


15

在遇到相同的错误时,我遇到了这个线程,经过一些研究后我可以确认,这是您尝试使用UTF-8解码UTF-16文件时发生的错误。

对于UTF-16,第一个字符(UTF-16中为2个字节)是字节顺序标记(BOM),它用作解码提示,并且不会在解码字符串中显示为字符。这意味着第一个字节将是FE或FF,第二个字节将是另一个。

我找到真正的答案后进行了大量编辑


这结束了2个小时的头痛!使用open('filename','r')作为f:打开文件,然后打印其内容将显示UTF-8,这是错误的。
nulldroid



1

检查要读取的文件的路径。我的代码一直在给我错误,直到我将路径名更改为当前工作目录为止。错误是:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1

如果您从串行端口接收数据,请确保使用正确的波特率(和其他配置):使用(utf-8)解码,但错误的配置会产生相同的错误

UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xff:无效的起始字节

在Linux上使用以下命令检查您的串行端口配置: stty -F /dev/ttyUSBX -a


1

这仅表示您选择了错误的编码来读取文件。

在Mac上,用于file -I file.txt查找正确的编码。在Linux上,使用file -i file.txt


0

处理从Linux生成的文件时,我遇到相同的问题。事实证明,这与包含问号的文件有关。


-1

我有一个类似的问题。

解决方法:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

但是,我还有另一个问题。一些html文件(以我为例)不是utf-8,因此我收到了类似的错误。当我排除这些html文件时,一切工作顺利。

因此,除了修复代码之外,还要检查您正在读取的文件,也许确实存在不兼容性。



-4

我有一个类似的问题。我尝试在tensorflow / models / objective_detection中运行示例并遇到相同的消息。尝试将Python3更改为Python2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.