Найти - Пользователи
Полная версия: В очередной раз про кодировки.
Начало » Python для новичков » В очередной раз про кодировки.
1
pyuser
Есть 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
proDiva
Попробуйте:

# -*- 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()
j2a
Подскажите, как прочитать txt?
txt закодирован, понятно, koi8-r. Текст легко декодируется в unicode:
utxt = txt.decode(enc)
Что делать с юникодом, думаю понятно (для начала попробуй просто print utxt :) ).
j2a
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()
proDiva
j2a
абсолютно согласна….. ваш способ красивее
pyuser
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?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB