Я получил некоторый текст в кодировке, но я не знаю, какая кодировка была использована. Есть ли способ определить кодировку текстового файла с помощью Python? Как я могу определить кодировку / кодовую страницу текстового файла имеет дело с C #.
Я получил некоторый текст в кодировке, но я не знаю, какая кодировка была использована. Есть ли способ определить кодировку текстового файла с помощью Python? Как я могу определить кодировку / кодовую страницу текстового файла имеет дело с C #.
Правильное определение кодировки все время невозможно .
(Из чарде FAQ)
Однако некоторые кодировки оптимизированы для конкретных языков, и языки не являются случайными. Некоторые последовательности символов появляются постоянно, тогда как другие последовательности не имеют смысла. Человек, свободно говорящий по-английски, который открывает газету и находит «txzqJv 2! Dasd0a QqdKjvz», сразу же поймет, что это не английский (хотя он полностью состоит из английских букв). Изучая много «типичного» текста, компьютерный алгоритм может имитировать этот вид беглости и сделать обоснованное предположение о языке текста.
Существует библиотека chardet, которая использует это исследование для определения кодировки. chardet - это порт кода автоопределения в Mozilla.
Вы также можете использовать UnicodeDammit . Он попробует следующие методы:
chardet
ссылку. Кажется хорошим, хотя и немного медленным.Другим вариантом для разработки кодировки является использование libmagic (код, стоящий за командой file ). Существует множество доступных привязок Python.
Привязки python, которые находятся в дереве исходных файлов, доступны в виде пакета debian python-magic (или python3-magic ). Он может определить кодировку файла, выполнив:
Существует также одноименный , но несовместимый пакет python-magic pip для pypi, который также использует
libmagic
. Он также может получить кодировку, выполнив:источник
libmagic
действительно жизнеспособная альтернативаchardet
. И отличная информация о названных пакетахpython-magic
! Я уверен, что эта двусмысленность кусает многих людейfile
не особенно хорош в идентификации человеческого языка в текстовых файлах. Он отлично подходит для идентификации различных форматов контейнеров, хотя иногда вам нужно знать, что это значит («документ Microsoft Office» может означать сообщение Outlook и т. Д.).open()
:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 169799: invalid start byte
. Файл кодирования согласно Vim,:set fileencoding
естьlatin1
.errors='ignore'
, вывод кода примера будет менее полезнымbinary
.Некоторые стратегии кодирования, пожалуйста, раскомментируйте по вкусу:
Возможно, вы захотите проверить кодировку, открыв и прочитав файл в форме цикла ... но вам может понадобиться сначала проверить размер файла:
источник
io
, какio.open(filepath, 'r', encoding='utf-8')
, что более удобно, потомуcodecs
что не конвертируется\n
автоматически при чтении и записи. Подробнее ЗДЕСЬВот пример чтения и принятия за чистую монету
chardet
предсказания кодирования, считыванияn_lines
из файла, если он большой.chardet
также дает вам вероятность (т. е.confidence
) его прогнозирования кодирования (не смотрел, как они с этим придумали), который возвращается с его прогнозомchardet.predict()
, так что вы можете как-то сработать, если хотите.источник
def predict_encoding(file_path, n=20): ... skip ... and then rawdata = b''.join([f.read() for _ in range(n)])
пробовал эту функцию на Python 3.6, отлично работал с кодировками "ascii", "cp1252", "utf-8", "unicode". Так что это определенно upvoteисточник
В зависимости от вашей платформы, я просто выбираю команду оболочки linux
file
. Это работает для меня, так как я использую его в сценарии, который работает исключительно на одной из наших машин Linux.Очевидно, что это не идеальное решение или ответ, но его можно изменить в соответствии с вашими потребностями. В моем случае мне просто нужно определить, является ли файл UTF-8 или нет.
источник
Это может быть полезно
источник
В принципе, невозможно определить кодировку текстового файла в общем случае. Так что нет, для этого нет стандартной библиотеки Python.
Если у вас есть более конкретные знания о текстовом файле (например, о том, что это XML), возможно, существуют библиотечные функции.
источник
Если вам известно какое-то содержимое файла, вы можете попытаться расшифровать его с помощью нескольких кодировок и посмотреть, что в нем отсутствует. В общем, нет никакого способа, так как текстовый файл является текстовым файлом, и это глупо;)
источник
На этом сайте есть код Python для распознавания ascii, кодирования с помощью boms и utf8 без bom: https://unicodebook.readthedocs.io/guess_encoding.html . Считайте файл в байтовый массив (данные): http://www.codecodex.com/wiki/Read_a_file_into_a_byte_array . Вот пример. Я в оссе.
источник