4

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

# какой то файл скачанный с интернета в неизвестной кодировке.
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)

2 Answers2

5

Можно использовать chardet:

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
    Еще мудренее чем у меня, и не все кодировки распознает, да еще и левый модуль нужно устанавливать, я так понял проще способа нет. – Игорь Игоряныч Aug 01 '17 at 17:14
  • 1
    Проще способа нет. Но chardet в этой области признанный стандарт, используемый чуть ли не каждым вторым модулем из PyPI. – Sergey Gornostaev Aug 01 '17 at 17:17
  • 3
    @ИгорьИгоряныч: способ в вопросе явно неверный: отсутствие исключения не говорит, что "правильную кодировку" нашли -- вы таким образом кракозябры можете получить. В общем случае, не существует метода определения "правильной" кодировки. Но отдельные кодировки могут быть более вероятными нежели другие. chardet именно этим и занимается: гадает какие кодировки наибольшие шансы имеют. – jfs Aug 02 '17 at 07:57
-2

Все очень просто.

with open(file_path, "r") as f:
    print(f)

В выводе будет информация об объекте файла в том числе и кодировка.

  • 2
    Файл будет открыт в стандартной для системы кодировке, например cp1251 для русскоязычной версии Windows. Если файл на самом деле в кодировке utf-8, то при попытке чтения будет ошибка кодировки. – insolor Feb 03 '21 at 08:34
  • 1
    @insolor не, будет примерно такой текст: ываыва – Эникейщик Feb 03 '21 at 08:39
  • @Эникейщик, а, ну да, это если наоборот cp1251 пытаться открыть в utf-8, то будет ошибка. Но в любом случае это явно не решение проблемы с кодировкой) – insolor Feb 03 '21 at 08:41