2016-04-25 9 views
0

Я пытаюсь написать «строку» в файл и получить следующее сообщение об ошибке:Как написать объект unicode в файл в Python?

UnicodeEncodeError: 'ascii' codec can't encode character u'\xcd' in position 6: ordinal not in range(128) 

Я попытался следующие методы:

print >>f, txt 
print >>f, txt.decode('utf-8') 
print >>f, txt.encode('utf-8') 

Ни один из них не работает. У меня такое же сообщение об ошибке.

Какова идея кодирования и декодирования? Если у меня есть объект unicode, я могу записать его непосредственно в файл или мне нужно преобразовать его в строку?

Как я могу узнать, какая трединга используется? Как я могу узнать, является ли это utf-8 или ascii или что-то еще?

ДОБАВЛЕНО

Я думаю, что я только что удалось сохранить строку в файл. print >>f, txt а также print >>f, txt.decode('utf-8') не работает но print >>f, txt.encode('utf-8') работы. Я не получаю сообщение об ошибке, и я вижу китайских символов в моем файле.

+1

И что это за строка? – EbraHim

+0

@EbraHim, я думаю, что это объект юникода, потому что я получил строки, читая их следующим образом: 'для строки в io.open (fname, encoding =" utf8 "):' – Roman

+0

@Roman для строки в io .open (fname, encoding = "utf8"): измените кодировку на utf-8 – Mani

ответ

1

Я думаю, вам нужно использовать библиотеку кодеков:

import codecs 

file = codecs.open("test.txt", "w", "utf-8") 
file.write(u'\xcd') 
file.close() 

работает отлично.

История кодирование/декодирование:

В прошлом было всего около ~ 60 символов, доступных в компьютерах (включая прописные и строчные буквы + номера + некоторые специальные символы). Таким образом, всего 1 байт было достаточно, чтобы назначить уникальный номер каждой букве. Присвоение чисел буквам для хранения в памяти называется кодировкой. Эта байтовая кодировка, которая по умолчанию используется в python, называется ASCII.

С ростом компьютеров в мире у нас должно быть больше букв и символов на компьютере. Так что 1 байт недостаточно. Появились различные схемы кодирования. Unicode является одним из самых известных. Символ, который вы пытаетесь сохранить в вашем файле, является символом Юникода, и ему нужно 2 байта. Поэтому вы должны явно указать Python, что вы не хотите использовать кодировку по умолчанию, то есть ASCII (потому что вам нужно 2 байта для этот символ).

3

Недавно я опубликовал another answer, который касается этой самой проблемы. Ключевые цитаты:

Хороший обзор разницы, читайте one of Joel's articles, но суть в том, что байты, хорошо, байтов (группы по 8 бит, без какого-либо дальнейшего смысла прилагается), в то время как персонажи являются вещи, которые делают строки текста. Кодирование превращает символы в байты, а декодирование превращает байты обратно в символы.

В Python 2, unicode объекты являются символьными строками. Обычный объект str может быть либо символьными строками, либо байтовыми строками. (Pro tip: используйте Python 3, это делает отслеживание намного проще.)

Вы должны проезд характер строк (не байты строк) print, но вы должны быть уверены, что эти строки символов могут быть закодированы с помощью кодека (например, ASCII или UTF-8), связанная с объект конечного файла f. Как часть процесса вывода, Python кодирует строку для вас. Если строка содержит символы, которые не могут быть закодированы кодеком файлового объекта, вы получите ошибки, подобные тому, который вы видите.

Не зная, что находится в вашем объекте txt, я не могу быть более конкретным.