【问题标题】:A Utf8 encoded file produces UnicodeDecodeError during parsingUtf8 编码文件在解析期间产生 UnicodeDecodeError
【发布时间】:2019-05-21 17:09:21
【问题描述】:

我正在尝试重新格式化文本文件,以便将其上传到管道 (QIIME2) - 我测试了 .txt 文件的前几行(但它是制表符分隔的),并且转换成功。但是,当我尝试对整个文件运行脚本时,我遇到了错误:

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

我已经确定文件编码是Utf8,所以我不确定问题出在哪里。

$ file filename.txt
filename: UTF-8 Unicode text, with very long lines, with CRLF line terminator

我还查看了与错误相关的一些行,但我无法直观地识别任何非正统字符。

我尝试使用以下方法强制对其进行编码:

$iconv -f UTF8 -t UTF8 filename.txt > new_file.txt

但是,产生的错误是:

iconv: illegal input sequence at position 152683

我的理解是,在该位置出现的任何字符都不能使用 utf-8 编码读取/翻译,但我不确定为什么说文件是用 utf-8 编码的。

我在 Linux 上运行它,数据本身是来自 BOLD 数据库的序列信息(如果其他人在尝试将其转换为适合 QIIME2 的格式时遇到类似问题)。

【问题讨论】:

标签: linux utf-8 character-encoding qiime


【解决方案1】:

file 是错误的。 file 命令不会读取整个文件。它的猜测基于文件的一些样本。我没有这方面的源代码,但file 处理大文件的速度非常快,没有其他解释。

我猜你的文件一开始实际上是 UTF-8,因为 UTF-8 具有特征字节序列。一段文本看起来像 UTF-8 而实际上不是。

但是包含字节 0x96 的文本部分不能是 UTF-8。很可能某些文本使用 8 位编码(如 CP1252)进行编码,然后连接到 UTF-8 文本。这是不应该发生的事情,因为现在您在一个文件中有多个编码。这样的文件在文本编码方面被破坏了。

这只是猜测,但根据我的经验,这是您描述的场景最可能的解释。

对于编码损坏的文本,您可以使用第三方 Python 库ftfy: fixes text for you。 它会在每个换行符处剪切您的文本,并尝试为每个部分找到(猜测)正确的编码。 它并不总是神奇地做正确的事情,但它非常好。

为了给你更详细的指导,你必须显示你正在调用的脚本的代码(如果它是你的代码并且你想修复它)。

【讨论】:

  • 嘿!非常感谢您的建议,我决定尝试 grep 查找非 UTF8 字符,我发现它就在我的文件中,这正是您所说的问题!
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多