我正在尝试重新格式化文本文件,以便可以将其上传到管道(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的格式时遇到了类似的问题)。
答案 0 :(得分:1)
file
是错误的。 file
命令不会读取整个文件。它基于文件的某些样本进行猜测。我没有相关的来源参考,但是file
在大型文件上是如此之快,以至于没有其他解释。
我猜您的文件开始时实际上是UTF-8,因为UTF-8具有特征性的字节序列。一段文本看起来看起来像UTF-8,但实际上却不太可能。
但是包含字节0x96的文本部分不能为UTF-8。某些文本可能已使用CP1252之类的8位编码进行编码,然后被合并为UTF-8文本。这是不应该发生的事情,因为现在您在一个文件中有多种编码。这样的文件在文本编码方面是坏的。
这仅仅是猜测,但是根据我的经验,这是您所描述的场景的最可能的解释。
对于编码错误的文本,可以使用第三方Python库ftfy: fixes text for you。 它将在每个换行符处剪切文本,并尝试找到(猜测)每个部分的正确编码。 它并非总是魔术般地做正确的事,但这很好。
要给您更详细的指导,您必须显示正在调用的脚本的代码(如果它是您的代码,并且您想对其进行修复)。