Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 14, 2007 08:32:58

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки.

Есть email-сообщение.
Работаю с ним следующим образом: (пусть сообщение сохранено в файл “message.eml”)

import email

fp = file("message.eml", "rb")
msg = email.message_from_file(fp)
fp.close()
хочу прочитать тему письма
print msg["Subject"]
вижу
=?koi8-r?Q?=F0=CF=C4=D4=D7=C5=D2=D6=C4=C5=CE=C9=C5=20?==?koi8-r?Q?=CF=20?==?koi8-r?Q?=D0=CF=CC=D5=DE=C5=CE=C9=C9=20?==?koi8-r?Q?=DA=C1=CD=C5=DD=C1=C0=DD=C5=CA=20?==?koi8-r?Q?=C9=CE=C6=CF=D2=CD=C1=C3=C9=C9?=
пробую
txt, enc = email.Header.decode_header(msg["Subject"])[0]
enc - читается легко - “koi8-r”, а вот
txt ,как в прочем и txt.encode(enc)
выглядят совсем не читабельно

Подскажите, как прочитать txt?

P.S. Windows XP SP2 python 2.5.1



Отредактировано (Ноя. 14, 2007 08:54:57)

Офлайн

#2 Ноя. 14, 2007 09:57:54

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

В очередной раз про кодировки.

Попробуйте:

# -*- coding: cp1251 -*-

import email
from email.Header import make_header as mkh
from email.Header import decode_header as dkh

msg_file = ‘c:/msg.eml’

def print_mail():
msg = email.message_from_file(file(msg_file))
msg_from = msg
msg_to = msg
msg_date = msg
msg_subj = ''.join([text for text,enc in dkh(msg)])

print ‘От: ’+msg_from+'\nКому: ‘+msg_to+ \
’\nКогда: ‘+msg_date+’\nТема: '+msg_subj
return

print_mail()



Офлайн

#3 Ноя. 14, 2007 11:09:37

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

В очередной раз про кодировки.

Подскажите, как прочитать txt?
txt закодирован, понятно, koi8-r. Текст легко декодируется в unicode:
utxt = txt.decode(enc)
Что делать с юникодом, думаю понятно (для начала попробуй просто print utxt :) ).



Офлайн

#4 Ноя. 14, 2007 11:13:30

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

В очередной раз про кодировки.

proDiva
Попробуйте:

print ‘От: ’+msg_from+'\nКому: ‘+msg_to+ \
’\nКогда: ‘+msg_date+’\nТема: '+msg_subj
Не красиво же. Сравни с:

print ‘От: %s\nКому: %s \nКогда: %s\nТема: %s’ % (msg_from, msg_to, msg_date, msg_subj)

или лучше с таким:

print ‘От: %(msg_from)s\nКому: %(msg_to)s \nКогда: %(msg_date)s\nТема: %(msg_subj)s’ % locals()



Офлайн

#5 Ноя. 14, 2007 14:24:42

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

В очередной раз про кодировки.

j2a
абсолютно согласна….. ваш способ красивее



Офлайн

#6 Ноя. 15, 2007 02:46:18

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В очередной раз про кодировки.

proDiva
j2a
Спасибо.
Оказывается все дело в правильном выборе ПО для работы.
со строкой txt.encode(enc) я конечно погорячился (какие только комбинации из unicode(), encode() и decode() я не выписывал), а в остальном пример изначально был рабочим
proDiva
Ну и чтобы было совсем красиво, сроку, в Вашем примере
msg_subj = “”.join([text for text, enc in dkh(msg)])
заменил на
msg_subj = “”.join([enc and text.decode(enc) or text for text, enc in dkh(msg)])

P.S. в данном, конкретном случае перед парсингом заголовков письма целесообразно избавиться от вставок ?==?koi8-r?Q?



Отредактировано (Ноя. 15, 2007 03:01:39)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version