Форум сайта python.su
начал питон недавно и сразу вывали - поправить скрип, чтобы было единообразие в кодировках.
он подхватывает настройки с текстовика конфигурационного, часть информации с базы данных, а потом по результатам отправляет письма.
проблема в том, что кодировка в безе utf-8, а в конфигурационном файле cp 1251, если его сохранить в utf то скрип его не ест. пробовал использовать фунцию decode при открытии файла, но тогда обработка скрипта нарушается, пришла мысль попробовать переделать переменные в юникод, а потом собрать encode в нужную кодировку. может что подскажите?
import smtplib
from time import gmtime, strftime
from MySQLdb import connect, cursors
def ReadConfig(Path):
file = open(Path, 'r')
Params = {}
for s in file:
if s[0] == '#':
continue
elif s[0] == '@':
s = s[1:-1]
LastParam = ''
N = s.find('=')
if N == -1:
continue
Param = s[:N]
Value = s[N+1:]
if Value == '...':
LastParam = Param
Value = ''
Params[Param] = Value
else:
if LastParam:
Params[LastParam] = '%s%s' % (Params[LastParam], s)
file.close()
return Params
def SendMessage(Params, To, Topic, Body):
Msg = 'Date: %s\r\nFrom: %s\r\nTo: %s\r\ncontent-type: text/plain;charset=utf-8\r\nSubject: %s\r\n\r\n%s'
Time = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
Msg = Msg % (Time, Params['portal_mail'], To, Topic, Body)
server = smtplib.SMTP(Params['mail_server'],)
server.sendmail(Params['portal_mail'], To, Msg)
server.quit()
# Читаем параметры из файла настроек
MailParams = ReadConfig('portalmail.cfg')
# Соединяемся с базой данных
conn = connect(host='localhost', db='inetstat', user='script_user', passwd='Vfyecrhbgn')
cursor = conn.cursor()
cursor.execute('SET NAMES %s COLLATE %s', ('utf8', 'utf8_unicode_ci'))
cursor2 = conn.cursor()
# Сначала отправляем все предупреждения и затираем флаг новизны у этих событий
SQL = """
SELECT firstname, midname, email, comments
FROM events INNER JOIN users ON userid=evuserid
WHERE eventtype=3 AND newflag=1
"""
cursor.execute(SQL)
while (1):
res = cursor.fetchone()
if res:
reason = res[3]
if len(reason) == 0:
reason = MailParams['default_ban_reason']
Text = MailParams['user_warning_body'] % (res[0], res[1], reason)
SendMessage(MailParams, res[2], MailParams['user_warning_topic'], Text)
else:
break
# Снимаем флаги новизны с предупреждений
cursor.execute('UPDATE events SET newflag=0 WHERE eventtype=3')
# Перебираем таблицу событий, получаем последний статус каждого пользователя в плане Интернета
LastEvents = {}
cursor.execute('SELECT evuserid, eventtype, eventid, newflag FROM events WHERE eventtype<>3 ORDER BY date')
while (1):
res = cursor.fetchone()
if res:
LastEvents[res[0]] = (res[1], res[2], res[3])
else:
break
# Перебираем список пользователей в поисках противоречий
A = 0
cursor.execute('SELECT userid, inetaccess FROM users')
while (1):
res = cursor.fetchone()
if res:
uid = res[0]
LastEvent = LastEvents.get(uid, (-1, -1, -1))
if (LastEvent[0] == 2 and res[1] > 0) or (LastEvent[0] in [1, 4] and res[1] == 0):
# Если противоречие найдено - обновляем флаг последнего события: ставим 2.
# Если команда отключить была подана накануне, то флаг будет равен 1. После этого такую команду уже будет нельзя отменить.
cursor2.execute('UPDATE events SET newflag=2 WHERE eventid=%s', LastEvent[1])
A = 1
else:
# А если противоречий нет, но стоит флаг нового события - снимаем его.
cursor2.execute('UPDATE events SET newflag=0 WHERE evuserid=%s', uid)
else:
break
# Если в базе имеются новые события, отправляем письма администраторам
if A:
SendMessage(MailParams, MailParams['admin_mail'], MailParams['admin_newevents_topic'], MailParams['admin_newevents_body'])
Отредактировано (Дек. 3, 2011 10:02:48)
Офлайн
Код оформите, пожалуйста.
Какие именно ошибки возникают?
Вообще, можно поконкретнее вопрос переформулировать?
А так:
unicode(s.decode('cp1251'))
Офлайн
попробую в понедельник на работе, вначале пробовал в лоб file = codec.open(Path, ‘r’, ‘utf-8’), но скрипт переставал работать
а так же как написано на хабре http://habrahabr.ru/blogs/python/117236/ может поможет или это http://www.py-my.ru/post/4bfb3c6a1d41c846bc00009b жаль все на работе уже бы посмотрел,
нашел что то похожее попробую z = s.decode('utf-8').encode('windows-1251')
def SendMessage(Params, To, Topic, Body):
Msg = 'Date: %s\r\nFrom: %s\r\nTo: %s\r\ncontent-type: text/plain;charset=utf-8\r\nSubject: %s\r\n\r\n%s'
Time = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
Msg = Msg % (Time, Params['portal_mail'], To, Topic, Body)
server = smtplib.SMTP(Params['mail_server'],)
server.sendmail(Params['portal_mail'], To, Msg)
server.quit()
Отредактировано (Дек. 4, 2011 09:12:27)
Офлайн
всем спасибо сдела через a = line.decode('utf8').encode('cp1251', “replace”) возник вопрос только, а как можно провернуть это со словарем?
MailParams - словарь
for key in MailParams:
MailParams.values = values.decode('cp1251').encode('utf8', “replace”)
ругается что MailParams.values список идите накер
Офлайн
for key in MailParams:
MailParams.values = map(lambda a: a.decode('cp1251').encode('utf8', "replace"), MailParams.values)
Офлайн