ChatGPT解决这个技术问题 Extra ChatGPT

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

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。

如果您想尝试修复错误文件而不是使用不同编码解析文件,请尝试在您尝试使用 python 代码处理的文件上运行 dos2unix

A
Alfe

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

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

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

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

open() 中模式说明符中的 b 表明文件应被视为二进制文件,因此 contents 将保持为 bytes。这种方式不会发生解码尝试。


我收到错误“ValueError:模式字符串必须以'r'、'w'、'a'或'U'之一开头,而不是'br'”
@Unnikrishnan 好的,然后使用 rb (我认为顺序并不重要,但至少在某些系统/版本中似乎如此)。我相应地改变了我的答案。
byte 0xff in position 0 也可能意味着文件以 UTF-16 编码,那么您可以改为使用 with open(path, encoding='utf-16') as f:
如果位置 0 实际上没有 0xff 字符怎么办?它是 UTF-8 编码的。
我认为这是正确的答案:在处理二进制文件时,不涉及编码,也不应该涉及。
N
Nitish Kumar Pal

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

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

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


也适用于 decode():contents = contents.decode('utf-8', 'ignore') 来源:docs.python.org/3/howto/unicode.html#the-string-type
应该是最好的答案
当您说“丢失一些字符”时,您的意思是不会读取有错误的文件吗?或者不是该文件的所有内容都会被读取?
@msoutopico 因为它忽略了错误,所以不会读取一些导致问题的编码。但是从来没有遇到过在阅读时被跳过的任何内容。所以基本上编码问题被忽略了。
@NitishKumarPal,好的,所以不应跳过或丢失任何真实内容
R
Ramineni Ravi Teja

使用编码格式 ISO-8859-1 来解决这个问题。


在尝试了 10 多种其他编码后终于登陆了!
如果 actual 编码不是 ISO-8859-1,这将隐藏错误但会产生垃圾。如果您不确定,请检查一些字符代码在 128-255 范围内的字符串。也可以看看tripleee.github.io/8bit
这将消除错误,但这仅仅是因为 ISO-8859-1 为 256 个可能的字节值中的每一个定义了一个字符。它们不一定是正确的字符,尽管没有错误,您仍需要验证您正在阅读的文本是否正确。
有时它会给出正确的字符,但大多数时候它会给出垃圾值,例如“1.5 1 0 obj > endobj 2 0 obj > endobj 4 0 obj > stream x½½þù/qyúßù§ÿ¢ÿèÿþðçõ¯ÿø¿þòÿG\ü;x¯ ¯oüùïó_÷þýòÿøß~ù¿ùå/þ¡îÝR^?/jáòòòüþô~ÿ|þx}L_¿}^__.÷ÛóçûÓëççóíöôöúòüÒWÿú¿x¿0´ÍIâ èÛå)ä¼{$éúÎ oÎçåùÏ^{Øilúñs
为什么这可以解决问题?是因为它的编码比 UTF8 多吗?
t
tattmoney76

有类似的问题,最终使用 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 格式返回代码。从那里它将被解码并按行分隔。


在 Python 3 中,您可以使用编码参数 with open(path, encoding='utf-16') as f 来简化此操作
@NikolaiRKristiansen 我尝试使用您的方法,但出现 TypeError: an integer is required (got type str) 错误。为什么?这两个文件都是二进制文件,读取为 rb
@Bogota encoding 参数仅在阅读文本时才有意义。从模式参数中删除“b”并重试。在文档中阅读更多信息:docs.python.org/3/library/functions.html#open
P
Peter Ogden

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

With UTF-16 the first characther (2 bytes in UTF-16) is a Byte Order Mark (BOM),用作解码提示,在解码后的字符串中不作为字符出现。这意味着第一个字节将是 FE 或 FF,第二个字节是另一个。

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


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

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

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

with open(path, newline='', encoding='cp1252') as csvfile:
    reader = csv.reader(csvfile)

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


N
Nwawel A Iroume

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

with open(path, "rb") as f:

P
Paul Roub

仅使用

base64.b64decode(a) 

代替

base64.b64decode(a).decode('utf-8')

它的工作,但只是为了理解你能解释一下为什么吗? :)
特别是,你在哪里使用它?什么是'a'?
M
Minh Triet

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

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


l
lejlun

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

示例解决方案。

df = pd.read_csv("File path", encoding='cp1252')

这是我结束的地方,不知道这个答案。刚刚在这个线程中检查了是否有人这样回答,是的 - 有人这样做了。
太感谢了!
@ElizabethGrant 欢迎您
T
Tonechas

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

pd.read_csv(filename, delimiter=';')

我用了:

pd.read_csv(open(filename, 'r'), delimiter=';')

这对我来说似乎很好。

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


J
Juan Navarrete

如果您使用的是 Mac,请检查是否有隐藏文件 .DS_Store。删除文件后,我的程序工作了。


S
Saif Faidi

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

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

检查你在 linux 上的串口配置,使用:stty -F /dev/ttyUSBX -a


M
MoShamroukh

我有一个类似的问题,并在整个互联网上搜索了这个问题

如果您遇到此问题,只需将您的 HTML 代码复制到一个新的 HTML 文件中并使用正常的 <meta charset="UTF-8"> 即可。...

只需在同一位置创建一个新的 HTML 文件并使用不同的名称


我不知道为什么,但这有效!我承认我很困惑
l
luchonacho

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

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

A
Ali Hassan

您必须使用 latin1 编码来读取此文件,因为此文件中有一些特殊字符,请使用以下代码片段来读取文件。

这里的问题是编码类型。当 Python 无法转换要读取的数据时,会报错。

您可以使用 latin1 或其他编码值。

我说尝试和测试为您的数据集找到合适的。


K
Kostas Tsiligkiris

我有一个类似的问题。

通过以下方式解决了它:

import io

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

但是,我遇到了另一个问题。一些 html 文件(在我的情况下)不是 utf-8,所以我收到了类似的错误。当我排除那些 html 文件时,一切都很顺利。

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


w
wfolkerts

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


G
Gajanan Kothawade

以下代码适用于我的情况:

df = pd.read_csv(文件名,sep = '\t',编码='cp1252')


M
Manoj Joshi

如果可能,请在文本编辑器中打开文件并尝试将编码更改为 UTF-8。否则在操作系统级别以编程方式进行。


u
user8665083

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