Как узнать кодировку файла python
Перейти к содержимому

Как узнать кодировку файла python

  • автор:

Модуль chardet в Python, определение кодировки

Когда мы думаем о тексте, то представляем слова и буквы, которые видим на экране компьютера. Но компьютеры не работают с буквами и символами. Они имеют дело с битами и байтами. Каждый фрагмент текста, который выводится на экране, на самом деле хранится в определенной кодировке символов. Существует множество различных кодировок, некоторые из которых оптимизированы для определенных языков, таких как русский, китайский или английский, а другие могут использоваться для нескольких языков. Грубо говоря, кодировка символов обеспечивает соответствие между тем, что мы видим на экране, и тем, что компьютер фактически хранит в памяти и на диске.

Модуль chardet , это автоматический детектор кодировки текста и является портом кода автоопределения в Mozilla. Этот модуль поможет определить кодировку символов, если вдруг на экране появятся «кракозябры«.

Модуль chardet отлично поддерживает и определяет русские кодировки: KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251(Cyrillic)

Установка модуля chardet в виртуальное окружение.

# создаем виртуальное окружение, если нет $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # ставим модуль chardet (VirtualEnv):~$ python -m pip install -U chardet

Примеры автоматического определения кодировки символов:

Самый простой способ автоматически определить кодировку — это использовать функцию обнаружения detect() модуля chardet .

>>> import urllib.request, chardet >>> rawdata = urllib.request.urlopen('http://yandex.ru/').read() >>> chardet.detect(rawdata) # >>> rawdata = urllib.request.urlopen('https://www.zeit.de/index').read() >>> chardet.detect(rawdata) #

Расширенное использование модуля chardet .

Если имеется большой объем текста/данных, то можно вызывать обнаружение кодировки постепенно. Как только модуль будет достаточно уверен в своих результатах, он остановится.

Для такого поведения необходимо создать объект UniversalDetector(), затем повторно вызывать его метод подачи .feed() с каждым блоком текста. Если созданный детектор достигнет минимального порога достоверности, он установит для Detector.done значение True.

В конце работы детектора необходимо вызвать Detector.close() , который выполнит некоторые окончательные вычисления в случае, если детектор не достиг минимального порога достоверности.

import urllib.request from chardet.universaldetector import UniversalDetector usock = urllib.request.urlopen('https://www.zeit.de/index') # создаем детектор detector = UniversalDetector() for line in usock.readlines(): # скармливаем детектору строки detector.feed(line) if detector.done: # если детектор определил # кодировку, то прерываем цикл break # закрываем детектор detector.close() # закрываем соединение с сайтом usock.close() print(detector.result) #

Пример определения кодировки нескольких файлов.

Для определения кодировки текстовых файлов, их необходимо открывать в режиме чтения байтов: more=’rb’

import glob from chardet.universaldetector import UniversalDetector # создаем детектор detector = UniversalDetector() for filename in glob.glob('*.xml'): print(filename.ljust(60), end='') # сбрасываем детектор # в исходное состояние detector.reset() # проходимся по строкам очередного # файла в режиме 'rb' for line in open(filename, 'rb'): detector.feed(line) if detector.done: break detector.close() print(detector.result) 

Узнать кодировку файла

Есть файл не понятно в какой кодировке, нужно определить кодировку, написал вот такой вариант, но уверен что есть способ определения кодировки на много проще, подскажите.

# какой то файл скачанный с интернета в неизвестной кодировке. open('test.txt', 'w', encoding='cp500').write('Hello\n') # сюда можно впихнуть все известные кодировки. encoding = [ 'utf-8', 'cp500', 'utf-16', 'GBK', 'windows-1251', 'ASCII', 'US-ASCII', 'Big5' ] correct_encoding = '' for enc in encoding: try: open('test.txt', encoding=enc).read() except (UnicodeDecodeError, LookupError): pass else: correct_encoding = enc print('Done!') break print(correct_encoding) 

Отслеживать
задан 1 авг 2017 в 15:17
Игорь Игоряныч Игорь Игоряныч
1,903 4 4 золотых знака 14 14 серебряных знаков 27 27 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

from chardet.universaldetector import UniversalDetector detector = UniversalDetector() with open('test.txt', 'rb') as fh: for line in fh: detector.feed(line) if detector.done: break detector.close() print(detector.result) 

Отслеживать
ответ дан 1 авг 2017 в 16:27
Sergey Gornostaev Sergey Gornostaev
66.3k 6 6 золотых знаков 51 51 серебряный знак 112 112 бронзовых знаков

Еще мудренее чем у меня, и не все кодировки распознает, да еще и левый модуль нужно устанавливать, я так понял проще способа нет.

1 авг 2017 в 17:14

Проще способа нет. Но chardet в этой области признанный стандарт, используемый чуть ли не каждым вторым модулем из PyPI.

1 авг 2017 в 17:17

@ИгорьИгоряныч: способ в вопросе явно неверный: отсутствие исключения не говорит, что «правильную кодировку» нашли — вы таким образом кракозябры можете получить. В общем случае, не существует метода определения «правильной» кодировки. Но отдельные кодировки могут быть более вероятными нежели другие. chardet именно этим и занимается: гадает какие кодировки наибольшие шансы имеют.

Определение кодировки и перевод в UTF-8

Алекс получил от своего друга Никиты из России электронное письмо с вложенным текстовым файлом (не маленьким – точно больше 100Кб) и был удивлен его содержимым. Алекс давно знаком с Никитой и знает, что текст точно на русском языке, что он все пишет в нижнем регистре, и что Никита принципиально не использует никакие кодировки, кроме однобайтовых. Алекс хотел бы определить, какую кодировку Никита использовал (CP866 (DOS), CP1251 (Windows), KOI8R, ISO-8859-5, cp10007(MacOS)), и увидеть первые 2048 символов этого файла в кодировке UTF-8. Воспользуйтесь имеющимися данными, напишите программу, которая будет определять автоматически определять кодировку и выводить первые 2048 символов этого файла в кодировке UTF-8.

Буду очень благодарен)
Идей нет совсем

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Определение кодировки в строке и преобразование ее в UTF-8
С помощью этого куска кода я получаю html страницы и записываю как обычную строку в response.

Перевод из кодировки UTF — 8 в ANSI
Всем привет! Пишу прогу на линухе, результаты работы вывожу в html файл. Так вот когда открываю.

Перевод из кодировки UTF-8 в CP866
Нужно сделать функцию, которая переводит текст из кодировки UTF-8 в CP866. То есть с нуля, так-как.

Перевод кодировки из utf-8 в windows-1251
Такая проблема: распарсил некоторый xml файл, у которого в атрибут значится кодировка utf-8. Затем.

Программа для конвертации тектового файла из кодировки UTF-8 в UTF-16
Привет. Как можно реализовать эту программу на чистом си?

Python3 декодирование/чтение Dat файла. Как определить кодировку файла?

63090e3397c4f147599497.png

Здравствуйте!
Передо мной стоит задача прочитать .Dat файл но проблема в том что он имеет какую-то странную кодировку и при попытке его прочитать редактором(В моем случае Nano) я вижу следующее:

Так-же я пробовал прочитать его посредствам python3 через

f = open('file_name.dat', 'r', encoding="utf-8") print(f.read())

Вместо utf-8 я пробовал подставить другую кодировку из этого сайта, был еще один с кодировками Cyrillic но его я уже не найду.
Я перепробовал их все, большинство не подошли и я просто получал ошибку по типу такой:

UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 0-3: code point not in range(0x110000)
  • Python3.10.4
  • OS: Ubuntu 22.04.1 LTS
  • Вопрос задан более года назад
  • 397 просмотров

Комментировать
Решения вопроса 1
никого не трогаю, починяю примус

это не кодировка. это файл с данными какого-то формата. быстрое гугление по заголовку «Crofile» выдало что это вероятно «база Cronos».

Ответ написан более года назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 2

Тут имхо сразу понятно, что это не текст в кодировке.
Но вообще выяснение кодировки текстового файла это перебор по списку кодировок или использование модулей, которые, однако, всё равно определяют не точную кодировку, а наиболее вероятную.
Когда искал ответ на этот вопрос, тут
https://stackoverflow.com/questions/436220/how-to-.
нашёл chardet
https://pypi.org/project/chardet/

Ответ написан более года назад
Комментировать
Нравится Комментировать
mayton2019 @mayton2019
Bigdata Engineer

Лет 10 назад мне попала в руки база абонентов мобильного оператора. Как раз в формате Cronos. Но открыть я ее не смог приложением. Дело в том что этот формат использует симметричное шифрование данных. Как архиватор RAR. Без знания пароля — безнадёжное дело.

Поэтому Python здесь не поможет. Надо первым делом понять с чем мы имеем дело. Открыть файл приложением клиентом и убедится что он хотя-бы не шифрован.

Ответ написан более года назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python

Как правильно оформить код?

  • 1 подписчик
  • 9 часов назад
  • 63 просмотра

python

  • Python
  • +1 ещё

Как формировать сырые SQL запросы максимально эффективно?

  • 1 подписчик
  • 12 часов назад
  • 59 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *