Проблема с кодировками. Преобразование кодировок

Какие есть утилиты для определения кодировки файла? Задача простая. Мне приезжают файлы, а мне нужно их преобразовать из кодировки X в 'utf-8'. Как решить?


Ответы (2 шт):

Автор решения: CrazyElf

На питоне есть неплохая либа chardet. Набросал заготовку кода под вашу задачу. Проверил с файлами в cp1251 и utf-8 на входе, вроде работает.

import chardet

filename = 'testfile.txt'
with open(filename, 'rb') as f_det:
    rawdata = f_det.read()
    enc = chardet.detect(rawdata)
    print(enc)
if enc['encoding'] != 'utf-8':
    text = rawdata.decode(enc['encoding'])
    with open(filename + '_utf-8', 'w', encoding='utf-8') as f_out:
        f_out.writelines(text)
→ Ссылка
Автор решения: hedgehogues

Я поступил простым способом. Взял все стандартные кодировки для питона отсюда и сделал так:

def decode(contents):
    """
    decode gets any bytes and try transform it to all standart encode. All variants this function returns as list of strings
    
    list standart encoding https://docs.python.org/3/library/codecs.html#standard-encodings
    """
    encodings = [
        "ascii","big5","big5hkscs","cp037","cp273","cp424","cp437","cp500","cp720","cp737","cp775","cp850","cp852",
        "cp855","cp856","cp857","cp858","cp860","cp861","cp862","cp863","cp864","cp865","cp866","cp869","cp874","cp875",
        "cp932","cp949","cp950","cp1006","cp1026","cp1125","cp1140","cp1250","cp1251","cp1252","cp1253","cp1254",
        "cp1255","cp1256","cp1257","cp1258","euc_jp","euc_jis_2004","euc_jisx0213","euc_kr","gb2312","gbk","gb18030",
        "hz","iso2022_jp","iso2022_jp_1","iso2022_jp_2","iso2022_jp_2004","iso2022_jp_3","iso2022_jp_ext","iso2022_kr",
        "latin_1","iso8859_2","iso8859_3","iso8859_4","iso8859_5","iso8859_6","iso8859_7","iso8859_8","iso8859_9",
        "iso8859_10","iso8859_11","iso8859_13","iso8859_14","iso8859_15","iso8859_16","johab","koi8_r","koi8_t",
        "koi8_u","kz1048","mac_cyrillic","mac_greek","mac_iceland","mac_latin2","mac_roman","mac_turkish","ptcp154",
        "shift_jis","shift_jis_2004","shift_jisx0213","utf_32","utf_32_be","utf_32_le","utf_16","utf_16_be",
        "utf_16_le","utf_7","utf_8","utf_8_sig",
    ]
    succeed = []
    for e in encodings:
        try:
            contents.decode(e)
            succeed.append(e)
        except:
            pass
    return succeed

Оформил в виде небольшой репы.

→ Ссылка