Форум сайта python.su
Всем доброго времени суток!
У меня возникла проблема с сохранением данных, полученных по POP3. Проблема естественно с кодировкой) Данные с POP3 я получаю в кодировке koi8-r, но в файл сохраняются они очевидно в cp1251, из-за чего содержимое оного становится нечитаемым. Причем замена в свойствах проекта cp1251 -> koi8-r ничего не меняет. Как решить проблему - никак не могу придумать. Прошу совета.
Код:
…
f = file(“test.txt”,“w”)
…
result = sock.recv(1024)
f.write(result)
…
Офлайн
посмотри соседнюю тему про кодировки
Офлайн
В соседней теме (надеюсь не промахнулся), советуется указать кодировку проекта=utf-8, после чего полученную строку (recv'ом) декодировать (в Unicode), а после энкодировать в koi8-r. Вроде все хорошо, но после указания:
# -*- coding: utf-8 -*-
в начале файла, получаю ошибку при декодировании:
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xe1 in position 6: ordinal not in range(128)
насколько я понимаю, вся проблема в содержащихся в строке русских буквах.
Офлайн
А что написано в заголовке Content-Transfer-Encoding?
Попробуй воспользоваться стандартным пакетом email, для парсинга сообщения. Я такой фигней не страдал, так что нет полной уверенности в том, что необходимый функционал присутствует в полном объеме.
..bw
Офлайн
Все, решил проблему.
Решение представляется в виде алгоритма: снести Python 2.5 -> поставить Python 3.1.1 -> запустить в нем ранее созданную программу -> “Вау, оно работает!!!!!”
Офлайн
ЖенькаТрудно назвать такой способ решением, разве что вам побоку какая версия Питона, тогда да…
Все, решил проблему.
Офлайн
Действительно, говно, а не решение!
Предложишь лучше?
Офлайн
Доброго времени суток.
Решил освоить Python, ну шоб с пользой для дела - под конкретную задачу. Для нее как нельзя лучше подходит пример, который есть в половине интернета, немного переделав под себя получил следующий код
# -*- coding: UTF-8 -*-
import poplib, email, quopri
server='pop3.mail.ru'
user='xxxx@mail.ru'
passwd='xxxxx'
pop=poplib.POP3(server)
print pop.user(user)
print pop.pass_(passwd)
response, lst, octets = pop.list()
print response
for msgnum, msgsize in :
print “Сообщение %(msgnum)s имеет длину %(msgsize)s” % vars()
print “UIDL =”, pop.uidl(int(msgnum)).split()
(resp, lines, octets) = pop.retr(msgnum)
msgtxt = “\n”.join(lines)+“\n\n”
msg=email.message_from_string(msgtxt)
print “* От: %(from)s\n* Кому: %(to)s\n* Тема: %(subject)s\n” % msg
print pop.quit()
получаю следующий результат
Сообщение 53 имеет длину 1744
UIDL = 1322122204905
* От: =?KOI8-R?Q?=F5=C4=CF=D7=C5=CE=CB=CF_=F3=C5=D2=C7=C5=CA?=
<xxx@bk.ru>
* Кому: xxx@mail.ru
* Тема: Fwd: =?KOI8-R?Q?=F4=C5=CB=D5=DD=C9=C5_=CB=D5=D2=D3=D9_=D7=C1?=
=?KOI8-R?Q?=CC=C0=D4_=CB_=D2=D5=C2=CC=C0_=D7_=D3=C9=D3=D4=C5=CD=C5?=
=?KOI8-R?Q?_=3F=F4=C5=CC=C5=C2=C1=CE=CB=3F?=
Сообщение 54 имеет длину 1828
UIDL = 1322201447320
* От: =?utf-8?B?0KHQuNGB0YLQtdC80LAg0YPQstC10LTQvtC80LvQtdC90LjQuSDQktCi0JEgMjQgKNCX0JDQnik=?= <notify@vtb24.ru>
* Кому: xxx@bk.ru
* Тема: =?utf-8?B?0JrRg9GA0YHRiyDQsdC10LfQvdCw0LvQuNGH0L3QvtC5INC60L7QvdCy0LXRgNGB0LjQuCDQstCw0LvRjtGC0LAt0LLQsNC70Y7RgtCwINCyINGB0LjRgdGC0LXQvNC1IMKr0KLQtdC70LXQsdCw0L3QusK7?=
я уже по всякому пробовал но ничего сделать не могу как мне раскодировать все эти строки? причем видно же что письма приходят в разных кодировках, а почему выводятся неправильно не пойму.
Офлайн
используй email.header.decode_header()
Офлайн
py.user.nextЧет как-то слишком неудобно получается. Весь массив msg брать не хочет только по одной строчке, возвращает список с аброказяброй и названием кодировки, отдельно вытянуть аброказябру не получается, печатает все вместе с названием кодировки:
используй email.header.decode_header()
Офлайн