Python: как конфертировать из Windows 1251 в Unicode?

Я пытаюсь преобразовать содержимое файла из Windows-1251 (кириллица) в Unicode с Python. Я нашел эту функцию, но она не работает.

#!/usr/bin/env python

import os
import sys
import shutil

def convert_to_utf8(filename):
# gather the encodings you think that the file may be
# encoded inside a tuple
encodings = ('windows-1253', 'iso-8859-7', 'macgreek')

# try to open the file and exit if some IOError occurs
try:
    f = open(filename, 'r').read()
except Exception:
    sys.exit(1)

# now start iterating in our encodings tuple and try to
# decode the file
for enc in encodings:
    try:
        # try to decode the file with the first encoding
        # from the tuple.
        # if it succeeds then it will reach break, so we
        # will be out of the loop (something we want on
        # success).
        # the data variable will hold our decoded text
        data = f.decode(enc)
        break
    except Exception:
        # if the first encoding fail, then with the continue
        # keyword will start again with the second encoding
        # from the tuple an so on.... until it succeeds.
        # if for some reason it reaches the last encoding of
        # our tuple without success, then exit the program.
        if enc == encodings[-1]:
            sys.exit(1)
        continue

# now get the absolute path of our filename and append .bak
# to the end of it (for our backup file)
fpath = os.path.abspath(filename)
newfilename = fpath + '.bak'
# and make our backup file with shutil
shutil.copy(filename, newfilename)

# and at last convert it to utf-8
f = open(filename, 'w')
try:
    f.write(data.encode('utf-8'))
except Exception, e:
    print e
finally:
    f.close()

Как я могу это сделать?

Спасибо

3 ответа

Решение
import codecs

f = codecs.open(filename, 'r', 'cp1251')
u = f.read()   # now the contents have been transformed to a Unicode string
out = codecs.open(output, 'w', 'utf-8')
out.write(u)   # and now the contents have been output as UTF-8

Это то, что вы собираетесь делать?

Если вы используете codecs Модуль, чтобы открыть файл, он будет делать преобразование в Unicode для вас, когда вы читаете из файла. Например:

import codecs
f = codecs.open('input.txt', encoding='cp1251')
assert isinstance(f.read(), unicode)

Это имеет смысл, только если вы работаете с данными файла в Python. Если вы пытаетесь преобразовать файл из одной кодировки в другую в файловой системе (что и пытается сделать опубликованный вами скрипт), вам придется указать фактическую кодировку, поскольку вы не можете записать файл в "Unicode".

Это всего лишь предположение, так как вы не указали, что вы подразумеваете под "не работает".

Если файл генерируется правильно, но, похоже, содержит символы мусора, вероятно, приложение, которое вы просматриваете, не распознает, что он содержит UTF-8. Вам нужно добавить спецификацию в начало файла - 3 байта 0xEF,0xBB,0xBF (Незакодированный).

Другие вопросы по тегам