繁体   English   中英

Python:UnicodeDecodeError:'utf-8'编解码器无法解码 position 中的字节 0x80 0:无效起始字节

[英]Python: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

我正在从目录中获取数据,它以字节格式提供数据。

字节数据:

b'\x80\x00\x00\x00\n\x00\x00%\x83\xa0\x08\x01\x00\xbb@\x00\x00\x05p 
\x02\x00>\xf3\x00\x00\x00}\x02\x00`\x03\xef0\x00\x00\r\xc0 
\x06\xf0>\xf3\x00\x00\x02\x88\x02\x03\xec\x03\xef0\x00\x00/.....'

在将此数据转换为字符串或任何可读格式时,我收到此错误:

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

我使用的代码(Python 3.7.3):

blobs = blob.decode('utf-8')

import json
json.dumps(blob.decode())

我也使用过pickleastpprint但它们在这里没有帮助。

我尝试了什么:

您可以尝试忽略不可读的块。

blobs.decode('utf-8', 'ignore')

这不是一个很好的解决方案,但是您生成字节 object 的方式存在一些问题。 也许, utf-8不是您数据的正确编码。

UTF-8 编码具有一些内置冗余,至少有两个用途:

1) 定位来回读取的代码点

起始字节(以携带实际数据的二进制点表示)匹配这 4 种模式之一

0.......
110.....
1110....
11110...

而连续字节(0到3)总是这种形式

10......

2) 检查有效性

如果不遵守此编码,则可以肯定地说它不是 UTF-8 数据,例如因为在传输期间发生了损坏。

结论

为什么可以说b'\x80\'不能是UTF-8? 已经在前两个字节处违反了编码:因为 80 必须是连续字节。 正是您的错误消息所说的:

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

即使你跳过这个,你也会在b'%\x83'一些字节后遇到另一个问题,所以很可能你要么试图解码错误的数据,要么假设错误的编码。

您示例中的数据显然不是任何常见编码的文本。 Python 和我们都无法找到将显然不是文本的数据转换为字符串的方法。

如果这是一种定义明确的二进制文件格式,请找到该格式的解析器(理想情况下是流行的 Python 库,但对于更晦涩或专有的格式,您可能无法找到)或自己编写一个数据是结构化的,要么通过巧妙的实验和良好的猜测,要么通过查找(如果不是权威的,那么可能或多或少具有推测性的第三方)文档。

如果您只是想将字节转换为具有相同 Unicode 代码点的代码点字符串(例如,输入字节\xff映射到 Unicode 代码点U+00FF ),则'latin-1'编码会执行此操作,晦涩但方便。 这种情况下的结果显然不是有用的人类可读文本; 在许多方面,将数据保留为bytes会更自然,更不容易出错并且更方便。

对于这个编码错误

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

或其他类似的,您只需打开扩展名为.json的数据库文件并将编码更改为 UTF-8(例如在 VScode 中,您可以在右下角导航栏中进行更改)并保存文件...

现在运行

 $ git status

你会有这样的结果

 On branch master
 Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git restore <file>..." to discard changes in working directory)
        modified:   store/dumps/store.json
   (use "git add <file>..." to include in what will be committed)
        .gitignore

 no changes added to commit (use "git add" and/or "git commit -a")

或类似的东西

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   store/dumps/store.json
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore

对于第一种情况,你只需要这样做

$ git add store/dumps/

第二种情况不需要前面的部分......

现在,对于这两种情况,您必须提交更改

$ git commit -m "launching to production"

控制台将返回一条消息,通知您添加和更改...

您必须再次为应用程序构建日志

$ git push heroku master

(适用于 heroku 用户)

构建后,您只需要再次加载数据库

heroku run python manage.py loaddata store/dumps/store.json

它将安装对象。/。

为我的英语水平找借口!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM