【问题标题】:error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xff:无效的起始字节
【发布时间】:2017-07-09 10:56:15
【问题描述】:

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

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

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

【问题讨论】:

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

标签: python python-3.x utf-8


【解决方案1】:

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()

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 编码的。
  • 我认为这是正确的答案:在处理二进制文件时,不涉及编码,也不应该涉及。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      遇到类似的问题,最终使用 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
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我在遇到同样的错误时遇到了这个线程,经过一些研究我可以确认,这是当您尝试使用 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,这是错误的。
        【解决方案7】:

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

        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,好的,因此不应跳过或丢失任何真实内容
        【解决方案8】:

        只使用

        base64.b64decode(a) 
        

        而不是

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

        【讨论】:

        • 它的工作,但只是为了理解你能解释一下为什么吗? :)
        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

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

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

          【讨论】:

            【解决方案11】:

            使用编码格式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â èÛÎå)ä¼{$éúÎ ¬Pÿá$0JÏ{²úñsr^n
            • 为什么这能解决问题?是不是因为它的编码比UTF8多?
            【解决方案12】:

            我也遇到过类似的问题。

            通过以下方式解决它:

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

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

            所以,除了修复代码之外,还要检查你正在读取的文件,也许那里确实存在不兼容。

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                  【解决方案15】:

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

                  如果您遇到此问题,只需将您的 HTML 代码复制到一个新的 HTML 文件中并使用普通的&lt;meta charset="UTF-8"&gt; 它会起作用....

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

                  【讨论】:

                  • 我不知道为什么,但这有效!我承认我很困惑
                  【解决方案16】:

                  你必须使用latin1的编码来读取这个文件,因为这个文件中有一些特殊字符,使用下面的代码sn-p来读取文件。

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

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

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

                  【讨论】:

                    【解决方案17】:

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

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

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

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

                    【讨论】:

                      【解决方案18】:

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

                      中为我工作
                      with open(path, "rb") as f:
                      

                      【讨论】:

                        【解决方案19】:

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

                        示例解决方案。

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

                        【讨论】:

                        • 这是我结束的地方,不知道这个答案。刚刚在这个线程中检查了是否有人这样回答,是的 - 有人这样做了。
                        • 非常感谢!
                        • @ElizabethGrant 欢迎您
                        【解决方案20】:

                        我在尝试使用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()函数解析数据。

                        【讨论】:

                          猜你喜欢
                          • 2021-12-01
                          • 2016-05-13
                          • 1970-01-01
                          • 2019-05-07
                          • 2018-03-14
                          • 1970-01-01
                          • 1970-01-01
                          • 2020-02-06
                          相关资源
                          最近更新 更多