2016-05-02 2 views
-1

Я пытаюсь распечатать список dicts в файл, закодированный в латинском-1. Каждое поле должно быть отделены друг от друга символов ASCII 254 и в конце строки должны быть ASCII символов 20.Использование номера ASCII для символа в python

Когда я пытаюсь использовать символ, который больше 128 я получаю «UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 12: ordinal not in range(128)»

Это мой текущий код. Может ли кто-нибудь помочь мне в том, как кодировать ASCII-символ 254 и как добавить конец строки ASCII-символ 20 при использовании DictWriter.

Благодаря мой код:

with codecs.open("test.dat", "w", "ISO-8859-1") as outputFile: 

     delimiter = (chr(254)) 
     keys = file_dict[0].keys() 
     dict_writer = csv.DictWriter(outputFile, keys, delimiter=delimiter) 
     dict_writer.writeheader() 
     for value in file_dict: 
      dict_writer.writerow(value) 
+0

Открыть файл с 'File = codecs.open ("test.txt", "ж",«UTF -8") '. – EbraHim

+0

Используйте Python 3, если можете. – mhawke

+0

Можете ли вы подтвердить, что используете Python2.x? Python2 и 3 имеют разные идиомы здесь ... –

ответ

0

ASCII имеет только содержат коды символов 0-127.

Коды в диапазоне 128-255 не определены в ASCII, но только в кодеках, которые расширяют его, например ANSI, латинский-1 или все Юникоды.

В вашем случае это, вероятно, как-то двойное кодирование строки, что не удается.

Это работает, если вы используете стандартные встроенные функции open без указания кодека:

with open("test.dat", "w") as outputFile: # omit the codec stuff here 
    delimiter = (chr(254)) 
    keys = file_dict[0].keys() 
    dict_writer = csv.DictWriter(outputFile, keys, delimiter=delimiter) 
    dict_writer.writeheader() 
    for value in file_dict: 
     dict_writer.writerow(value) 
+0

Вы почти правы. Поскольку модуль codecs ожидает выход unicode, он сначала пытается преобразовать строку байтов, содержащую символы chr (254), и не работает с 'UnicodeDecodeError', потому что преобразование по умолчанию - ascii. Таким образом, это не проблема двойного кодирования, а преобразование в unicode, требуемое кодеками. –

+0

Но мне нужен файл в ISO-8859-1, если я удалю кодеки, как еще я могу закодировать файл. Добавление кодировки в writerow дает кодирование Nonetype. Кроме того, как я могу добавить символ «END of LINE» ascii ?! – sipra287

Смежные вопросы