Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2011 10:23:46

chaotism
От:
Зарегистрирован: 2010-11-29
Сообщения: 76
Репутация: +  1  -
Профиль   Отправить e-mail  

кодировки в двух режимах

начал питон недавно и сразу вывали - поправить скрип, чтобы было единообразие в кодировках.
он подхватывает настройки с текстовика конфигурационного, часть информации с базы данных, а потом по результатам отправляет письма.
проблема в том, что кодировка в безе 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)

Офлайн

#2 Дек. 2, 2011 10:30:28

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

кодировки в двух режимах

Код оформите, пожалуйста.
Какие именно ошибки возникают?

Вообще, можно поконкретнее вопрос переформулировать?
А так:

unicode(s.decode('cp1251'))



Офлайн

#3 Дек. 3, 2011 10:46:35

chaotism
От:
Зарегистрирован: 2010-11-29
Сообщения: 76
Репутация: +  1  -
Профиль   Отправить e-mail  

кодировки в двух режимах

попробую в понедельник на работе, вначале пробовал в лоб 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()
Эта функция отправляет письмо. Причем Params, Topic Она берет из текстового файла cp1251, To, Body из базы данных и веб интерфейса соотвесвенно, дальше описано как они в utf-8. Пробовал текстовой файл сохранять не ascii, а в utf-8, тогда скрипт его не ест, пробовал



Отредактировано (Дек. 4, 2011 09:12:27)

Офлайн

#4 Дек. 5, 2011 09:58:03

chaotism
От:
Зарегистрирован: 2010-11-29
Сообщения: 76
Репутация: +  1  -
Профиль   Отправить e-mail  

кодировки в двух режимах

всем спасибо сдела через a = line.decode('utf8').encode('cp1251', “replace”) возник вопрос только, а как можно провернуть это со словарем?

MailParams - словарь
for key in MailParams:
MailParams.values = values.decode('cp1251').encode('utf8', “replace”)
ругается что MailParams.values список идите накер



Офлайн

#5 Дек. 5, 2011 10:01:04

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

кодировки в двух режимах

for key in MailParams:
MailParams.values = map(lambda a: a.decode('cp1251').encode('utf8', "replace"), MailParams.values)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version