Файл в кодировке Utf8 создает UnicodeDecodeError во время анализа - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь переформатировать текстовый файл, чтобы я мог загрузить его в конвейер (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 Ответ

1 голос
/ 21 мая 2019

file неверно. Команда file не читает весь файл. Он основывает свое предположение на некотором образце файла. У меня нет исходной ссылки для этого, но file настолько быстр для больших файлов, что другого объяснения нет.

Я предполагаю, что ваш файл на самом деле является UTF-8 в начале, потому что UTF-8 имеет характерные последовательности байтов. Маловероятно, что фрагмент текста выглядит только как UTF-8, но на самом деле это не так.

Но часть текста, содержащая байт 0x96, не может быть UTF-8. Вполне вероятно, что некоторый текст был закодирован с помощью 8-битной кодировки, такой как CP1252, а затем слит в текст UTF-8. Этого не должно происходить, потому что теперь у вас есть несколько кодировок в одном файле. Такой файл не работает в отношении кодировки текста.

Это всего лишь догадки, но, по моему опыту, это наиболее вероятное объяснение сценария, который вы описали.

Для текста с неработающей кодировкой вы можете использовать стороннюю библиотеку Python ftfy: исправляет текст для вас . Он обрежет ваш текст при каждом символе новой строки и попытается найти (угадать) правильную кодировку для каждой части. Волшебным образом это не всегда делает правильно, но это довольно хорошо.

Чтобы дать вам более подробное руководство, вам нужно будет показать код скрипта, который вы вызываете (если это ваш код, и вы хотите его исправить).

...