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

时间:2017-02-20 08:43:18

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

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。

20 个答案:

答案 0 :(得分:95)

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

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

答案 1 :(得分:38)

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

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

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

答案 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")

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

答案 3 :(得分:11)

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

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

在我找到真正的答案

后进行了大量编辑

答案 4 :(得分:4)

读取( r )CSV details.csv 文件,并通过 utf8 进行编码。如果发生错误,则忽略该错误,只需通过以下代码即可完成。

with open('details.csv', 'r',encoding="utf8", errors='ignore') as csvDataFile:
    csvReader = csv.DictReader(csvDataFile)

答案 5 :(得分:3)

仅使用

base64.b64decode(a) 

而不是

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

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

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

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

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

答案 9 :(得分:1)

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

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

您可以latin1或其他编码值。

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

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

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

[HttpPost]    
public ActionResult Index(MyViewModel viewModel)
{
    viewModel.User now contains the id of the user
}

答案 12 :(得分:0)

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

  

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

要在Linux上检查您的串行端口配置,请使用:stty -F /dev/ttyUSBX -a

答案 13 :(得分:0)

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

答案 14 :(得分:0)

我有类似的问题。

通过以下方式解决它:

import io

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

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

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

答案 15 :(得分:0)

HitHere, 你应该加载&#34; GoogleNews-vectors-negative300.bin.gz&#34;文件首先在Ubuntu中通过此命令提取它:gunzip -k GoogleNews-vectors-negative300.bin.gz。 [永远不建议手动提取]。 其次,你应该在pyrhon 3中应用这些命令:

import gensim model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True) . 我希望它会有用。

答案 16 :(得分:0)

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

答案 17 :(得分:0)

我遇到了类似的问题,并在互联网上搜索了这个问题

如果遇到此问题,只需将HTML代码复制到新的HTML文件中,然后使用常规的<meta charset="UTF-8"> 它将起作用....

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

答案 18 :(得分:-1)

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

答案 19 :(得分:-3)

If possible, open the file in a text editor and try to change the encoding to UTF-8. Otherwise do it programatically at the OS level.