Импорт файла с неизвестной кодировкой из Python в MongoDB - PullRequest
6 голосов
/ 14 января 2011

Работа над импортом файла с разделителями табуляции через HTTP в Python.

Перед вставкой данных строки в MongoDB я удаляю из строки косые черты, тики и кавычки.

* 1004Кодировка данных: MongoDB выдает мне исключение:
bson.errors.InvalidStringData: strings in documents must be valid UTF-8

Поэтому, пытаясь решить эту проблему, из прочитанного мною чтения я хочу как можно быстрее преобразоватьданные строки в Unicode, используя функцию unicode ().Кроме того, я попытался вызвать функцию decode (), передавая «Юникод» в качестве первого параметра, но получил ошибку:

LookupError: unknown encoding: unicode

Оттуда я могу выполнять свои строковые манипуляции, такие как замена слешей, галочеки цитаты.Затем перед вставкой данных в MongoDB преобразуйте их в UTF-8 с помощью функции str.encode ('utf-8').

Проблема: при преобразовании в Unicode я получаю сообщение об ошибке

UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128)

С этой ошибкой я не совсем уверен, где продолжить.

У меня такой вопрос: как мне успешно импортировать данные из файла, не зная его кодировки, и успешно вставить его в MongoDB, для чего требуется UTF-8?

Спасибо большое!

1 Ответ

7 голосов
/ 14 января 2011

Попробуйте это по порядку:

(0) Убедитесь, что удаление слешей / галочек / и т. Д. Не приводит к разделению данных.Что за галочка?Пожалуйста, покажите свой код.Пожалуйста, покажите образец необработанных данных ... используйте print repr(sample_raw data) и скопируйте / вставьте вывод в редактирование вашего вопроса.

(1) Существует старое правило: "Если кодировка файланеизвестно или заявлено как ISO-8859-1, это cp1252 "... откуда вы его взяли?Если он поступает из Западной Европы, Америки или любой другой страны / территории, говорящей по-английски, по-французски / по-испански, и не является UTF-8, то это, вероятно, cp1252

[Редактировать 2] Ваш байт ошибки 0x93 декодирует в U + 201C ЛЕВОЙ ДВОЙНОЙ ОТМЕТКИ ЦЕНЫ для всех кодировок cp1250 до cp1258 включительно ... на каком языке написан текст? [/ Edit 2]

(2) Сохраните файл (перед снятием галочки), затем откройте файл в браузере: выглядит ли он разумным?Что вы видите, когда нажимаете на Вид / Кодировка символов?

(3) Попробуйте chardet

Редактировать и еще несколько советов:

Как только вы узнаете, что такое кодировка (предположим, это cp1252):

(1) преобразует ваши входные данные в Unicode: uc = raw_data.decode('cp1252')

(2) обрабатывает данные (удалите косые черты / галочки / и т. д.) как Unicode: clean_uc = manipulate(uc)

(3) вам необходимо вывести данные в кодировке utf8: to_mongo = clean_uc.encode('utf8')

Примечание 1. Ваше сообщение об ошибке гласит «можетне декодировать байт 0x93 в позиции 1258 "... 1258 байт - это довольно длинный фрагмент текста;это разумно?Вы смотрели на данные, на которые он жалуется?Как?что вы видели?

Примечание 2: Пожалуйста, рассмотрите Python Unicode HOWTO и эту статью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...