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

pie*_*pie 127 python utf-8 python-3.x

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
Run Code Online (Sandbox Code Playgroud)

Traceback(最近一次调用最后一次):

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
Run Code Online (Sandbox Code Playgroud)

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

Alf*_*lfe 134

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()
Run Code Online (Sandbox Code Playgroud)

b在该模式说明open()指出,该文件应被视为二进制,所以contents仍将是一个bytes.这种方式不会发生解码尝试.

  • "位置0的字节0xff"也可能意味着文件以UTF-16编码,那么你可以用`open(path,encoding ='utf-16')作为f:`而不是 (37认同)
  • @Unnikrishnan好的,然后使用`rb`(我认为顺序并不重要,但似乎是,至少在某些系统/版本中).我相应地改变了答案. (3认同)
  • 我认为这是正确的答案:在处理二进制文件时,不涉及编码,也不应该涉及编码。 (2认同)
  • @Zim 开头的“\xff”不是文件内容的_部分_,而是_标记_的一部分,它告诉我们文件的_其余部分_的编码。因此读取二进制(不解码):`b = open(..., 'rb').read()`,然后检查编码和解码:`if b[0] == b'\xff': return b[1:].decode('utf-16')`。IIRC utf-16 的标记是“\xff”和第二个字节,而不仅仅是一个字节。 (2认同)

Nit*_*Pal 58

使用此解决方案,它将剥离(忽略)字符并返回没有它们的字符串.只有在您需要剥离它们而不是转换它们时才使用它.

with open(path, encoding="utf8", errors='ignore') as f:
Run Code Online (Sandbox Code Playgroud)

使用errors='ignore' 你只会丢失一些角色.但是如果你不关心它们,因为它们似乎是源于连接到我的套接字服务器的客户端的错误格式化和编程的额外字符.然后它是一个简单的直接解决方 参考

  • 也适用于decode():`contents = contents.decode('utf-8','ignore')`来源:https://docs.python.org/3/howto/unicode.html#the-string-类型 (4认同)
  • 应该是最好的答案 (2认同)

小智 17

有一个类似的问题,结束使用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")
Run Code Online (Sandbox Code Playgroud)

这会将文件内容作为导入,但它将以UTF格式返回代码.从那里它将被解码和分隔线.

  • 在Python 3中,您可以通过使用编码参数`with open(path,encoding ='utf-16')作为f来简化此操作. (8认同)
  • @Bogota `encoding` 参数仅在阅读文本时才有意义。从模式参数中删除“b”,然后重试。在文档中阅读更多内容:https://docs.python.org/3/library/functions.html#open (2认同)

Pet*_*den 12

我遇到同样的错误时遇到过这个问题,经过一些研究我可以确认,这是当你尝试用UTF-8解码UTF-16文件时发生的错误.

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

在我找到真正的答案后,重新编辑


小智 11

那些在处理 Pandas 数据帧时遇到类似错误的人使用以下解决方案。

示例解决方案。

df = pd.read_csv("File path", encoding='cp1252')
Run Code Online (Sandbox Code Playgroud)

  • 这就是我在不知道答案的情况下结束的地方。刚刚检查了这个帖子是否有人这样回答,是的 - 有人这样做了。 (2认同)

Nwa*_*ume 10

我对 PNG 文件也有类似的问题。我尝试了上面的解决方案但没有成功。这个在python 3.8中对我有用

with open(path, "rb") as f:
Run Code Online (Sandbox Code Playgroud)


pra*_*aka 8

仅使用

base64.b64decode(a) 
Run Code Online (Sandbox Code Playgroud)

代替

base64.b64decode(a).decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

  • 它有效,但只是为了理解你能解释一下为什么吗?:) (4认同)

Jie*_*Yin 6

这是由于读取文件时的编码方式不同造成的。在python中,它默认使用unicode对数据进行编码。但是,它可能不适用于各种平台。

我提出了一种编码方法,如果“utf-8”不起作用,它可以帮助您解决这个问题。

with open(path, newline='', encoding='cp1252') as csvfile:
    reader = csv.reader(csvfile)
Run Code Online (Sandbox Code Playgroud)

如果您在此处更改编码方法,它应该可以工作。此外,您可以在此处找到其他编码方法standard-encodings,如果上述方法不适合您。


Ram*_*eja 5

使用编码格式ISO-8859-1解决此问题。

  • 如果“实际”编码不是 ISO-8859-1,这将隐藏错误,但会产生垃圾。如果您不确定,请检查一些字符代码在 128-255 范围内的字符串。也许还可以参见https://tripleee.github.io/8bit/ (3认同)
  • 在尝试了 10 多种其他编码后终于找到了这个! (2认同)
  • 这将消除错误,但这只是因为 ISO-8859-1 为 256 个可能的字节值中的*每个*定义了一个字符。它们不一定是*正确的*字符,尽管没有错误,但您需要验证您正在阅读正确的文本。 (2认同)

Min*_*iet 5

它只是意味着人们选择了错误的编码来读取文件。

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


小智 5

UnicodeDecodeError在尝试使用 读取“.csv”文件时遇到了这个问题pandas.read_csv()。就我而言,我无法使用其他编码器类型来克服这个问题。但不是使用

pd.read_csv(filename, delimiter=';')
Run Code Online (Sandbox Code Playgroud)

我用了:

pd.read_csv(open(filename, 'r'), delimiter=';')
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎工作得很好。

注意:在open()函数中,使用'r'代替'rb'. 因为'rb'返回的bytes对象首先导致发生此解码器错误,所以在read_csv(). 但是'r'返回str需要的数据,因为我们的数据位于 中.csv,并且使用默认encoding='utf-8'参数,我们可以轻松地使用函数解析数据read_csv()