[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Да в общем-то весь тормозящий код приведен в моем первом вопросе.
    Если вкратце, то вот вся структура скрипта:
    Code:
    import ... <куча модулей>
    
    # класс, экземпляры которого будут являться потоками
    class Action(threading.Thread):
        def __init__(self, ...):
            ...
    
            # создаем функции
            def login(self, ...):
                # функция логина, тут все понятно
                ...
    
            def grab(self, ...):
                ...
                # тут собрали юзеров в список users
                # каждый юзер — строка типа 'Вася Пупкин'
                # дальше блэклист по именам
                for user in users:
    [B]                with lock:
                        cur.execute('select bl_name from bl_table where bl_name = ?', (user, ))
                        rs = cur.fetchone()[/B]
                    if rs:    # юзер есть в блэклисте
                        users.remove(user)
                return users
    
            def invite(self, user, ...):
                ...
                # здесь отправили приглашение для юзера
                # далее идет запись его в блэклист
    [B]            with lock:
                    cur.execute('insert into bl_table (bl_name) values (?)', (user, ))
                    con.commit()[/B]
    
            def work(self):
                # загрузили аккаунты (accs)
                for acc in accs:
                    # залогинились (функция login())
                    # собрали юзеров (функция grab() выдает список users)
                    for user in users:
                            # отправили приглашение (функция invite())
    
            # прикрепляем эти функции к экземпляру потока
            self.login = login
            self.grab = grab
            self.invite = invite
            self.work = work
            # продолжаем загрузку конструктора суперкласса
            threading.Thread.__init__(self)
    
    
        def run(self):
            self.work(self)
    
    
    ### основная программа
    # открываем соединение с базой
    [B]con = sqlite3.connect('bl.db', check_same_thread = False)
    cur = con.cursor()
    cur.execute('create table if not exists bl_table (bl_name text)')[/B]
    
    # запуск потоков
    threads = [Action() for tn in range(нужное_количество_потоков)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    
    Тут трабла в том, что мне записывать в блэклист надо не id (циферки), а ники юзеров (строки) типа «Вася Пупкин».
     
  2. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Code:
    import random, string
    from bsddb import db
    
    table = db.DB()
    table.open('table.db', db.DB_HASH, db.DB_CREATE)
    
    magic_words = (
        'hui',
        'pizda',
        'jigurda'
    )
    
    def fillbase():
        alphabet = string.ascii_lowercase + string.ascii_uppercase + string.digits
        for _ in xrange(1000000):
            nick = ''.join(random.choice(alphabet) for _ in xrange(10))
            table.put(nick, None)
        for x in magic_words:
            table.put(x, None)
    
    def check():
        for x in magic_words:
            if not table.get(x) is None:
                print x, 'found'
    
    #fillbase()
    check()
    
    Заполнение:
    Code:
    % time python test.py
    python test.py  62,42s user 22,73s system 99% cpu 1:25,72 total
    Доступ:
    Code:
    % time python test.py
    hui found
    pizda found
    jigurda found
    python test.py  0,04s user 0,01s system 102% cpu 0,047 total
     
  3. Slev7n

    Slev7n Elder - Старейшина

    Joined:
    16 Feb 2009
    Messages:
    145
    Likes Received:
    161
    Reputations:
    14
    добрые , мне надо отсылать каждый день маил с разным кон-тентом на определенный маил
    надо чтоб 5 разных msg рандомно висилалис + если не трудно подскажите как туда рандом хеш добавит ( чтобы проходило спам фильтры )

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    import smtplib , random

    msg = 'test'

    server = smtplib.SMTP('mail.xyz.com',25)
    server.ehlo()
    server.login('[email protected]','123456')
    server.set_debuglevel(1)
    server.sendmail('[email protected]','[email protected]',msg)
    server.close()

    к примеру
    msg = 'test1'
    msg = 'test2'
    msg = 'test3'
    msg = 'test4'
    msg = 'test5'

    к всем мsg надо добавит рандом хеш ( для антиспам )
     
    #883 Slev7n, 13 Nov 2011
    Last edited: 13 Nov 2011
  4. MyGreenLife

    MyGreenLife Member

    Joined:
    27 Nov 2009
    Messages:
    0
    Likes Received:
    9
    Reputations:
    6
    Всем привет, только начинаю изучать кодинг. Вот попробовал написать мелкую прогу вывода данных из localtime:

    Такой вопрос, как сделать так что бы else работало только если я ввел значение которое не принадлежит к инструкции "if d =" а то оно сейчас выводится после каждого результата.
     
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    MyGreenLife все, кроме первого, if заменить на elif
     
    _________________________
    1 person likes this.
  6. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    начал работать с базами данных на питоне через apsw. При попытке ввода русских букв в БД вываливаются ошибка "UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 52: ordinal not in range(128)"
    Code:
    #!/usr/bin/python
    #coding=UTF-8
    import apsw
    #соединение с бд вырезано
    text = 'Строка на русском языке'
    sql = 'INSERT INTO Text (ID,Strings) VALUES ( %s,text)' % lastid
    cursor.execute(sql)
    
    если текст заменить на англ, то все ок.
    что можно сделать в этом случае? какие модули для работы с БД вы используете?


    P.S вопрос решил. Достаточно писать нечто вроде
    Code:
    text = 'Строка на русском языке'.decode('UTF-8')
     
    #886 awdrg, 26 Nov 2011
    Last edited: 26 Nov 2011
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    awdrg apsw предназначен для sqlite? Чем вам тогда стандартный модуль не угодил? Если хочется погорячее тогда - SQLAlchemy
     
    _________________________
    1 person likes this.
  8. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    начал работать с бд через sqlite3, теперь возникает проблема другого плана. Русский текст заливается в базу без проблем, но после того как я его вывожу запросом "SELECT * FROM id" в консоль, появляется на экране текст вида:
    Code:
    (1, 'english')
    (2, u'\u043f\u0440\u0438\u0432\u0435\u0442')
    (3, u'\u043f\u043e\u043a\u0430')
    ...
    
    в офф документации читал про переменную Connection.row_factory, которая позволяет менять формат выводимых данных, но ее изменение на {str / unicode / sqlite3.OptimizedUnicode} не повлияло результат.

    исходник:
    Code:
    #!/usr/bin/env python
    #coding=UTF-8
    import sqlite3
    
    conn = sqlite3.connect('sqlite.db')
    c = conn.cursor()
    sql = "SELECT * FROM id"
    c.execute(sql)
    for row in c:
       print(row)
    print "Done."
    
    upd
    ошибка была в криво ПРИСПОСОБЛЕННОМ примере с офф сайта. В общем я заменил цикл на
    Code:
    for i in c.fetchall():
       print i[0],i[1]
    и все заработало
     
    #888 awdrg, 28 Nov 2011
    Last edited: 28 Nov 2011
    1 person likes this.
  9. MyGreenLife

    MyGreenLife Member

    Joined:
    27 Nov 2009
    Messages:
    0
    Likes Received:
    9
    Reputations:
    6
    У меня такой вопрос, я например накодил что нибудь в нотпаде, сохранил файл с расширение .py

    Теперь когда я запускаю python.exe и хочу импортировать этот файл как модуль - он импортируется, но и одновременно выполняется код этого файла. Можно как нибудь сделать так что бы код не выполнялся, а модуль импортировался?
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    MyGreenLife не совсем очевидно, что вы хотите. Если вы хотите, чтобы некоторые действия из модуля выполнялись только при прямом вызове, то следует использовать такую конструкцию:
    Code:
    # всякие разные действия
    if __name__ == '__main__':
        # действия выполняемые только при прямом вызове
    
     
    _________________________
  11. SterhTG

    SterhTG Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Доброе время суток всем.
    Работаю с urllib2, cookie. И вот наткнулся на грабли решения которому пока не нашёл. сайт отдает не совсем верные куки.
    Что такое не совсем верные куки, это куки такого вида : "Lang=2; expires=Thu, 08-Dec-11 17:02:17 GMT"
    Например мыл ру возвращает "Mpopl=1490110327; expires=Thu, 08 Dec 2011 17:21:42 GMT; path=/; domain=.mail.ru"
    В свете того что кука не совсем корректна, куки жар её не определяет и работать с ней не хочет.
    Код у меня почти с примера:
    Code:
    save_jar = cookielib.CookieJar() 
    Request = urllib2.Request 
    wrk2_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(save_jar)) wrk2_opener.addheaders = zip(req_hdr.keys(), req_hdr.values()) init_data = None  
    init_req = Request(wrk_url,init_data,{'Referer': 'http://www.ya.ru'}) 
    webdt = wrk2_opener.open(init_req)
    
    Есть ли возможность отключить данные проверки ?
    И как быть в такой ситуации ? Работать с куками вручную ?
     
    #891 SterhTG, 8 Dec 2011
    Last edited: 8 Dec 2011
  12. vernite akk=

    vernite akk= New Member

    Joined:
    18 May 2011
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    ДА
    Все он верно отдает)
    В спецификации указано что все кроме value являеться необязательным параметром..
     
  13. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG Mpopl нормально установилась:
    Code:
    import cookielib
    import urllib2
    
    cookie_jar = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
    
    req = urllib2.Request('http://mail.ru')
    try:
        conn = opener.open(req)
    except urllib2.HTTPError, e:
        conn = e
    finally:
        data = conn.read()
    
    for cookie in cookie_jar:
        print cookie
    Проблема где-то в другом месте, например в словаре req_hdr - есть элемент с ключом Cookie
     
    _________________________
  14. SterhTG

    SterhTG Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Эту проблему можно встретить тут. В словаре нет куки.
     
  15. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG Кукисы совпадают с браузерными (с точностью до значения). Да Lang - не устанавливается, но браузер ее также игнорирует.
    Code:
    import cookielib
    import urllib2
    
    cookie_jar = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
    
    req = urllib2.Request('https://issa.volgogsm.ru/cgi-bin/cgi.exe?function=is_login', 'Lang=2&Password=100500&mobnum=1234567890&x=28&y=17')
    try:
        conn = opener.open(req)
    except urllib2.HTTPError, e:
        conn = e
    finally:
        data = conn.read()
    print conn.headers
    
    for cookie in cookie_jar:
        print cookie
     
    _________________________
  16. MyGreenLife

    MyGreenLife Member

    Joined:
    27 Nov 2009
    Messages:
    0
    Likes Received:
    9
    Reputations:
    6
    У меня такой вопрос, почему команда "break" у меня работает только в IDLE Python Shell окне, а если пишу код в нотпаде с расширением .py например и потом открываю его, то окно моментально закрывается и помогает только удаление команды break, в чем мб дело? Спасибо.
     
  17. WolfThGun

    WolfThGun New Member

    Joined:
    23 Nov 2011
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    raw_input() в конце попробуй прописать.
     
  18. MyGreenLife

    MyGreenLife Member

    Joined:
    27 Nov 2009
    Messages:
    0
    Likes Received:
    9
    Reputations:
    6
    Всегда прописываю, иначе после выполнения программы окно автоматом закрывается.
     
  19. FewG

    FewG Member

    Joined:
    25 Dec 2009
    Messages:
    136
    Likes Received:
    12
    Reputations:
    0
    Совет на уровне бреда, запусти через cmd -> python script.py
     
  20. dister

    dister New Member

    Joined:
    15 Jan 2011
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Code:
    # -*- coding: utf-8 -*-
    ...
    f = open(r"123.xml", "w+")
    u = u.urlopen('http://site.com')
    page = u.read()
    c = codecs.lookup("utf-8")
    (dPage, dPageLen) = c.decode(page)	
    f.write(dPage)
    f.close()
    В файл сохраняются крокозяблы

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <ррр>
    	<uoy you="Ӡ벨 743" phone="743-00-00"></uoy>
    	<uoy you="Ӡ벨 ͮ" phone="507-12-32"></uov>
    ...
    Может кто сталкивался? Кто что посоветует?
     
    #900 dister, 16 Dec 2011
    Last edited: 16 Dec 2011