как узнать кодировку текстового файла python
Как определить кодировку текста?
Я получил некоторый текст в кодировке, но я не знаю, какая кодировка была использована. Есть ли способ определить кодировку текстового файла с помощью Python? Как определить кодировку / кодовую страницу текстовый файл имеет дело с C #.
8 ответов
Однако некоторые кодировки оптимизированы для конкретных языков, и языки не являются случайными. Некоторые последовательности символов появляются постоянно, тогда как другие последовательности не имеют смысла. Человек, свободно говорящий по-английски, который открывает газету и находит «txzqJv 2! Dasd0a QqdKjvz», сразу же поймет, что это не английский (хотя он полностью состоит из английских букв). Изучая много «типичного» текста, компьютерный алгоритм может имитировать этот вид беглости и сделать обоснованное предположение о языке текста.
Вы также можете использовать UnicodeDammit. Он попробует следующие методы:
В принципе, невозможно определить кодировку текстового файла в общем случае. Так что нет, для этого нет стандартной библиотеки Python.
Если у вас есть более конкретные знания о текстовом файле (например, что это XML), возможно, существуют библиотечные функции.
Некоторые стратегии кодирования, пожалуйста, раскомментируйте по вкусу:
Ниже приведен пример чтения и принятия номинального значения chardet предсказания кодирования, чтения n_lines из файла в случае его большого размера.
Очевидно, что это не идеальное решение или ответ, но его можно изменить в соответствии с вашими потребностями. В моем случае мне просто нужно определить, является ли файл UTF-8 или нет.
Если вам известно какое-то содержимое файла, вы можете попытаться расшифровать его с помощью нескольких кодировок и посмотреть, что в нем отсутствует. В общем, нет никакого способа, так как текстовый файл является текстовым файлом, и это глупо;)
Как узнать кодировку файла в Python?
Кто-нибудь знает, как получить кодировку файла в Python. Я знаю, что вы можете использовать модуль codecs для открытия файла с определенной кодировкой, но вы должны знать его заранее.
Есть ли способ автоматически определить, какая кодировка используется для файла?
Изменить: Спасибо всем за очень интересные ансперы. Вы также можете быть заинтересованы http://whatismyencoding.com/, который основан на чарте (более над сайтом работает флэш-память python)
ОТВЕТЫ
Ответ 1
К сожалению, нет «правильного» способа определить кодировку файла, просмотрев сам файл. Это универсальная проблема, не ограниченная питоном или какой-либо конкретной файловой системой.
Если вы читаете XML файл, первая строка в файле может дать вам подсказку о том, что такое кодировка.
В противном случае вам придется использовать некоторый подход на основе эвристики, например chardet (одно из решений, приведенное в других ответах), которое пытается угадать кодировку, исследуя данные в файле в необработанном байтовом формате. Если вы работаете в Windows, я считаю, что Windows API также предоставляет методы, чтобы попытаться угадать кодировку на основе данных в файле.
Ответ 2
Вы можете использовать BOM (http://en.wikipedia.org/wiki/Byte_order_mark) для обнаружения кодировки или попробовать эту библиотеку:
Ответ 3
Вот небольшой фрагмент, который поможет вам угадать кодировку. Догадывается, что между latin1 и utf8 неплохо. Он преобразует байтовую строку в строку юникода.
Ответ 4
Существует Unicode Dammit из Красивый суп, который использует chardet, но добавляет несколько дополнительных функций.
Он пытается прочитать кодировку из XML файлов или файлов HTML. Затем он пытается найти спецификацию или что-то подобное в начале файла. Если он не может этого сделать, он использует chardet.
Определение кодировки текста в Python
Я получил текст, который кодируется, но я не знаю, какая кодировка была использована. Есть ли способ определить кодировку текстового файла с помощью Python? Как я могу обнаружить кодировку / кодовую страницу текстового файла сделки с C#.
8 ответов
правильное обнаружение кодировки все время невозможно.
однако некоторые кодировки оптимизированы для конкретных языков и языков они не случайны. Некоторый символ последовательности всплывают все время, в то время как другие последовательности не имеют смысла. Ля человек, свободно владеющий английским языком, который открывает газета и находит » txzqJv 2!dasd0a QqdKjvz » мгновенно распознает, что это не английский (даже если это полностью состоит из английских букв). Изучая множество «типичных» текстов, компьютерный алгоритм может имитировать это вид беглости и сделать образованный угадайте язык текста.
есть chardet библиотека, которая использует это исследование, чтобы попытаться определить кодировку. chardet-это порт кода автоматического обнаружения в Mozilla.
вы также можете использовать UnicodeDammit. Он попробует следующее методы:
другой вариант для разработки кодировки-использовать libmagic (который является кодом command). Существует изобилие доступны привязки python.
привязки python, которые живут в дереве источника файлов, доступны как python-magic (или python3-магия) пакет Debian. Если можно определить кодировку файла, выполнив:
есть с одинаковыми именами, но несовместимо,python-magic пакет pip на pypi, который также использует libmagic. Он также может получить кодировку, выполнив:
Некоторые стратегии кодирования, пожалуйста, раскомментируйте по вкусу :
вы можете проверить кодировку, открыв и прочитав файл в виде цикла. но сначала вам может потребоваться проверить размер файла:
вот пример чтения и принятия по номиналу a chardet кодировка предсказание, чтение n_lines из файла в случае, если он большой.
Это, в принципе, невозможно определить кодировку текстового файла, в общем случае. Так что нет, нет стандартной библиотеки Python, чтобы сделать это за вас.
Если у вас есть более конкретные знания о текстовом файле (например, что это XML), могут быть библиотечные функции.
Если вы знаете некоторое содержимое файла, вы можете попытаться декодировать его с помощью нескольких кодировок и посмотреть, что отсутствует. В общем, нет никакого способа, так как текстовый файл является текстовым файлом, и это глупо;)
в зависимости от вашей платформы, я просто предпочитаю использовать Linux shell
Кодировки и шифрование¶
Кодировки¶
Наиболее распространённые кодировки
Обозначение в python
Латинские буквы, цифры и простые символы
Кириллическая кодировка (русский и другие языки)
Кодировка для русского языка
Unicode — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира. В настоящее время стандарт является преобладающим в Интернете.
стандарт включает более 138 тысяч символов;
каждый символ имеет определённое название и код (номер);
Примеры кодов, имен и соответствующих символов:
Конвертация данных между байтам и строками¶
Данные по сети передаются, как правило, в байтах. Например, метод socket.recv() получает данные в байтах. Чтобы преобразовывать данные из байт в строки и наоборот используются специальные методы:
В коде будет выглядеть так:
При работе с кодировкой важно помнить:
Если вы кодируете строку в байты кодировкой UTF-8, то и перекодировать её из байт нужно этой же кодировкой. Некоторые кодировки совместимы, но в большинстве случаев, нарушения этого правила ведёт к потере данных.
В своём коде всегда используйте кодировки Unicode, оптимально UTF-8, она используется по умолчанию в большинстве методов и функций, так что это снижает риск ошибок.
Шифрование¶
Шифр Цезаря
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, и так далее.
Повторить шифр можно в занятии
Формула для кодирования символа:
Шифр пар
Алфавит случайным образом записывают в 2 строки, и шифрование текста происходит заменой буквы на соседнюю ей по вертикали. Например:
Шифр Виженера
На алфавите длиной N вводят операцию добавления (циклического сдвига) букв. Пронумеровав буквы, добавляем их по модулю N (для англ. алфавита N=26).
Выбираем слово-ключ (пускай pass) и подписываем его под сообщением сколько нужно раз:
Задания¶
Доработайте прототип чата из прошлого урока таким образом, чтобы он корректно работал с русским языком (используйте методы кодирования и декодирования байтовых строк).
2. Напишите функцию для шифрования файла шифром Цезаря. Расшифруйте:
3. Напишите функцию для шифрования файла шифром пар. Расшифруйте:
4.* Напишите функцию для шифрования файла шифром Виженера. Расшифруйте. 5. Добавьте в чат (с кодировкой) возможность выполнять шифрование и дешифрование сообщения одним из шифров по выбору пользователя. 6. Доработайте чат таким образом, чтобы пользователь отправлял серверу имя зашифрованного файла и шифр, а сервер дешифровал его и отправлял содержимое файла обратно пользователю.
Функции encode() и decode() в Python
Методы encode и decode Python используются для кодирования и декодирования входной строки с использованием заданной кодировки. Давайте подробно рассмотрим эти две функции.
encode заданной строки
Мы используем метод encode() для входной строки, который есть у каждого строкового объекта.
Как и ожидалось, в результате получается объект :
Рассмотрим параметр encoding на примере.
Обработка ошибок
Тип ошибки | Поведение |
strict | Поведение по умолчанию, которое вызывает UnicodeDecodeError при сбое. |
ignore | Игнорирует некодируемый Unicode из результата. |
replace | Заменяет все некодируемые символы Юникода вопросительным знаком (?) |
backslashreplace | Вставляет escape-последовательность обратной косой черты (\ uNNNN) вместо некодируемых символов Юникода. |
Давайте посмотрим на приведенные выше концепции на простом примере. Мы рассмотрим входную строку, в которой не все символы кодируются (например, ö ),
Декодирование потока байтов
Поскольку encode() преобразует строку в байты, decode() просто делает обратное.
Это показывает, что decode() преобразует байты в строку Python.
Важность кодировки
Поскольку кодирование и декодирование входной строки зависит от формата, мы должны быть осторожны при этих операциях. Если мы используем неправильный формат, это приведет к неправильному выводу и может вызвать ошибки.
Первое декодирование неверно, так как оно пытается декодировать входную строку, которая закодирована в формате UTF-8. Второй правильный, поскольку форматы кодирования и декодирования совпадают.