2016-11-09 1 views
6

Мой код выглядит следующим образом:Python3: Преобразование Latin-1 в UTF-8

for file in glob.iglob(os.path.join(dir, '*.txt')): 
    print(file) 
    with codecs.open(file,encoding='latin-1') as f: 
     infile = f.read() 

with codecs.open('test.txt',mode='w',encoding='utf-8') as f: 
    f.write(infile) 

файлы, я работаю с кодируются в Latin-1 (я не мог открыть их в UTF-8, очевидно) , Но я хочу записать результирующие файлы в utf-8.

Но это:

<Trans audio_filename="VALE_M11_070.MP3" xml:lang="español"> 
<Datos clave_texto=" VALE_M11_070" tipo_texto="entrevista_semidirigida"> 
<Corpus corpus="PRESEEA" subcorpus="ESESUMA" ciudad="Valencia" pais="España"/> 

Вместо этого становится (в Gedit):

<Trans audio_filename="VALE_M11_070.MP3" xml:lang="espa뇃漀氀∀㸀ഀ਀㰀䐀愀琀`漀猀 挀氀愀瘀攀开琀攀砀琀漀㴀∀ 嘀䄀䰀䔀开䴀㄀㄀开 㜀 

Если я печатаю его на терминал, он показывает нормально.

Еще более запутанным является то, что я получаю, когда я открываю полученный файл с LibreOffice Writer:

<#T#r#a#n#s# (and so on) 

Так как я правильно конвертировать Latin-1 строку в строку UTF-8? В python2 это легко, но в python3 мне кажется сбивающим с толку.

Я уже пробовал их в различных комбинациях:

#infile = bytes(infile,'utf-8').decode('utf-8') 
#infile = infile.encode('utf-8').decode('utf-8') 
#infile = bytes(infile,'utf-8').decode('utf-8') 

Но почему-то я всегда в конечном итоге с той же странной продукции.

Заранее благодарен!

Редактировать: Этот вопрос отличается от вопросов, связанных с комментарием, поскольку это касается Python 3, а не Python 2.7.

+1

Первый декодировать строки, затем перекодировать его на 'utf-8'? –

+2

Возможный дубликат http://stackoverflow.com/questions/6539881/python-converting-from-iso-8859-1-latin1-to-utf-8 – user3030010

+0

http://stackoverflow.com/questions/14443760/python- convertting-latin1-to-utf8 –

ответ

0

В этом я нашел способ из половинной части. Это не то, что вы хотите/необходимость, но может помочь другим в правильном направлении ...

# First read the file 
txt = open("file_name", "r", encoding="latin-1") # r = read, w = write & a = append 
items = txt.readlines() 
txt.close() 

# and write the changes to file 
output = open("file_name", "w", encoding="utf-8") 
for string_fin in items: 
    if "é" in string_fin: 
     string_fin = string_fin.replace("é", "é") 

    if "ë" in string_fin: 
     string_fin = string_fin.replace("ë", "ë") 

    # this works if not to much needs changing... 

    output.write(string_fin) 

output.close(); 

* примечание для detection

0

Для питона 3.6:

your_str = your_str.encode('utf-8').decode('latin-1') 
Смежные вопросы