Подтвердить что ты не робот

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

Кто-нибудь знает, как получить кодировку файла в Python. Я знаю, что вы можете использовать модуль codecs для открытия файла с определенной кодировкой, но вы должны знать его заранее.

import codecs
f = codecs.open("file.txt", "r", "utf-8")

Есть ли способ автоматически определить, какая кодировка используется для файла?

Заранее спасибо

Изменить: Спасибо всем за очень интересные ансперы. Вы также можете быть заинтересованы http://whatismyencoding.com/, который основан на чарте (более над сайтом работает флэш-память python)

4b9b3361

Ответ 1

К сожалению, нет "правильного" способа определить кодировку файла, просмотрев сам файл. Это универсальная проблема, не ограниченная питоном или какой-либо конкретной файловой системой.

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

В противном случае вам придется использовать некоторый подход на основе эвристики, например chardet (одно из решений, приведенное в других ответах), которое пытается угадать кодировку, исследуя данные в файле в необработанном байтовом формате. Если вы работаете в Windows, я считаю, что Windows API также предоставляет методы, чтобы попытаться угадать кодировку на основе данных в файле.

Ответ 3

Вот небольшой фрагмент, который поможет вам угадать кодировку. Догадывается, что между latin1 и utf8 неплохо. Он преобразует байтовую строку в строку юникода.

# Attention: Order of encoding_guess_list is import. Example: "latin1" always succeeds.
encoding_guess_list=['utf8', 'latin1']
def try_unicode(string, errors='strict'):
    if isinstance(string, unicode):
        return string
    assert isinstance(string, str), repr(string)
    for enc in encoding_guess_list:
        try:
            return string.decode(enc, errors)
        except UnicodeError, exc:
            continue
    raise UnicodeError('Failed to convert %r' % string)
def test_try_unicode():
    for start, should in [
        ('\xfc', u'ü'),
        ('\xc3\xbc', u'ü'),
        ('\xbb', u'\xbb'), # postgres/psycopg2 latin1: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
        ]:
        result=try_unicode(start, errors='strict')
        if not result==should:
            raise Exception(u'Error: start=%r should=%r result=%r' % (
                    start, should, result))

Ответ 4

Существует Unicode Dammit из Красивый суп, который использует chardet, но добавляет несколько дополнительных функций.

Он пытается прочитать кодировку из XML файлов или файлов HTML. Затем он пытается найти спецификацию или что-то подобное в начале файла. Если он не может этого сделать, он использует chardet.

Ответ 5

#!/usr/bin/python

"""
Line by line detecting encoding if input and then convert it into UTF-8
Suitable for look at logs with mixed encoding (i.e. from mail systems)

"""

import sys
import chardet

while 1:
        l = sys.stdin.readline()
        e = chardet.detect(l)

        u = None
        try:
                if e['confidence'] > 0.3:
                        u = unicode(l, e['encoding'])
        except:
                pass

        if u:
                print u,
        else:
                print l,