0

我正在尝试重新格式化文本文件,以便可以将其上传到管道 (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 的格式时遇到类似问题)。

4

1 回答 1

1

file是错的。该file命令不会读取整个文件。它的猜测基于文件的一些样本。我没有这方面的源代码,但是file在大文件上速度如此之快,以至于没有其他解释。

我猜你的文件一开始实际上是 UTF-8,因为 UTF-8 具有特征字节序列。一段文本看起来像 UTF-8 但实际上并非如此是不太可能的。

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

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

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

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

于 2019-05-21T20:45:11.663 回答