Utf8编码的文件在解析过程中产生UnicodeDecodeError

时间:2019-05-21 17:09:22

标签: linux utf-8 character-encoding qiime

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

1 个答案:

答案 0 :(得分:1)

file是错误的。 file命令不会读取整个文件。它基于文件的某些样本进行猜测。我没有相关的来源参考,但是file在大型文件上是如此之快,以至于没有其他解释。

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

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

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

对于编码错误的文本,可以使用第三方Python库ftfy: fixes text for you。 它将在每个换行符处剪切文本,并尝试找到(猜测)每个部分的正确编码。 它并非总是魔术般地做正确的事,但这很好。

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