Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 11, 2009 22:55:05

aspe
От:
Зарегистрирован: 2009-06-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Есть некий файл aword.txt в нем есть строка.
\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc
есть скрипт aw.py

#!/usr/bin/python
import chardet, os
f = open ("aword.txt", "r")
for line in f:
print chardet.detect(line)
b = line.decode('cp1251')
print b

>>{'confidence': 1.0, 'encoding': 'ascii'}
>>\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc
Проблема состоит в том что chardet.detect(line) определяет строку как ascii.
Если скрипт изменить на:
#!/usr/bin/python
import chardet, os
line = "\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc"
print chardet.detect(line)
b = line.decode('cp1251')
print b

>>{'confidence': 0.98999999999999999, 'encoding': 'windows-1251'}
>>как+позвонить
то все нормально определяется chardet.detect(line) определяет строку как cp1251.
Почему при чтении из файл, строка в переменной определяется как ascii, а когда явно ее задать в скрипте то определяется как cp1251. Как решить эту проблему.



Офлайн

#2 Июнь 11, 2009 23:21:13

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

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

У вас получаются разные строки. В файле лежать байты со значения в виде символов ‘\’, ‘x’, ‘e’ и т.д. Это конечно же ascii.

А вот это

line = "\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc"
уже не простая строка, поскольку символ ‘\x’ является эскейп последовательность, говорящей что следующие 2 символа это hex значение, то интерпретируются питоном как символы в некой кодировке, которая уже cp1251.

Если вы перед строковым литералом ставите символ ‘r’, вот так
line = r"\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc"
то тоже получите ascii.



Офлайн

#3 Июнь 11, 2009 23:28:52

aspe
От:
Зарегистрирован: 2009-06-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Спасибо за ответ.
Если ли готовый метод, который сможет строку “\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc”
преобразовать в хекс-эскейп формат?



Офлайн

#4 Июнь 11, 2009 23:43:01

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

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

Вам нужно байты прочтенные из файла превратить в питонячью строку, например так:

line = line.decode('string_escape')



Офлайн

#5 Июнь 11, 2009 23:47:17

aspe
От:
Зарегистрирован: 2009-06-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Еще раз спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version