Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 4, 2009 20:26:29

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

Чтение по POP3 - koi8-r проблемка

Всем доброго времени суток!
У меня возникла проблема с сохранением данных, полученных по POP3. Проблема естественно с кодировкой) Данные с POP3 я получаю в кодировке koi8-r, но в файл сохраняются они очевидно в cp1251, из-за чего содержимое оного становится нечитаемым. Причем замена в свойствах проекта cp1251 -> koi8-r ничего не меняет. Как решить проблему - никак не могу придумать. Прошу совета.
Код:

f = file(“test.txt”,“w”)

result = sock.recv(1024)
f.write(result)



Офлайн

#2 Дек. 4, 2009 20:52:49

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

Чтение по POP3 - koi8-r проблемка

посмотри соседнюю тему про кодировки



Офлайн

#3 Дек. 4, 2009 22:48:36

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

Чтение по POP3 - koi8-r проблемка

В соседней теме (надеюсь не промахнулся), советуется указать кодировку проекта=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)

насколько я понимаю, вся проблема в содержащихся в строке русских буквах.



Офлайн

#4 Дек. 5, 2009 12:54:09

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Чтение по POP3 - koi8-r проблемка

А что написано в заголовке Content-Transfer-Encoding?
Попробуй воспользоваться стандартным пакетом email, для парсинга сообщения. Я такой фигней не страдал, так что нет полной уверенности в том, что необходимый функционал присутствует в полном объеме.

..bw



Офлайн

#5 Дек. 7, 2009 10:17:10

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

Чтение по POP3 - koi8-r проблемка

Все, решил проблему.
Решение представляется в виде алгоритма: снести Python 2.5 -> поставить Python 3.1.1 -> запустить в нем ранее созданную программу -> “Вау, оно работает!!!!!”



Офлайн

#6 Дек. 7, 2009 10:55:59

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Чтение по POP3 - koi8-r проблемка

Женька
Все, решил проблему.
Трудно назвать такой способ решением, разве что вам побоку какая версия Питона, тогда да…



Офлайн

#7 Дек. 7, 2009 11:33:30

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

Чтение по POP3 - koi8-r проблемка

Действительно, говно, а не решение!
Предложишь лучше?



Офлайн

#8 Ноя. 25, 2011 11:16:40

s_king
От:
Зарегистрирован: 2011-11-25
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение по POP3 - koi8-r проблемка

Доброго времени суток.
Решил освоить 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?=

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



Офлайн

#9 Ноя. 25, 2011 11:40:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Чтение по POP3 - koi8-r проблемка

используй email.header.decode_header()



Офлайн

#10 Ноя. 28, 2011 11:26:53

s_king
От:
Зарегистрирован: 2011-11-25
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение по POP3 - koi8-r проблемка

py.user.next
используй email.header.decode_header()
Чет как-то слишком неудобно получается. Весь массив msg брать не хочет только по одной строчке, возвращает список с аброказяброй и названием кодировки, отдельно вытянуть аброказябру не получается, печатает все вместе с названием кодировки:

…..
…str=email.header.decode_header(msg)
…print str

('sdfsdfsdfsdf', ‘utf-8’)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version