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

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

  1. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    Хм, и почему же это не подходит?

    вот например создаем файлы с разными кодировками:

    $iconv -f UTF-8 -t 866 <(echo Привет) > enc-866
    $iconv -f UTF-8 -t WINDOWS-1251 <(echo Привет) > enc-windows-1251
    $echo Привет > enc-utf-8

    Теперь запускаем следующий код (использующий эту либу):

    Code:
    import glob
    from chardet.universaldetector import UniversalDetector
    
    detector = UniversalDetector()
    
    for filename in glob.glob('enc-*'):
        print filename.ljust(60),
        detector.reset()
        for line in file(filename, 'rb'):
            detector.feed(line)
            if detector.done: break
        detector.close()
        print detector.result
    
    $ python enc.py
    enc-866 {'confidence': 0.98999999999999999, 'encoding': 'IBM866'}
    enc-windows-1251 {'confidence': 0.98999999999999999, 'encoding': 'windows-1251'}
    enc-utf-8 {'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

    Как видно, скрипт (точней либа) правильно определила разные кодировки.
     
    1 person likes this.
  2. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Не обратил внимания на то что он работает со строками, в таком случае да, но я не доверяю чужим модулям, до тех пор пока они не попадают в стандартную библиотеку.
    Доверяю Гвидо на все 100%, такая цацка я думаю была бы востребована, если ее не включили в стандартную поставку(более чем уверен в том, что этот вопрос поднимался), знач чето с ней не то.
    Вообще, если разобраться по большому счету, то использование чужих модулей конкретно сказывается на юзерах - первое это зависимости(и неудобство как следствие того), а второе-это кривизна кода самого модуля, упрощение команд бота ИМХО(!) не стоит того, чтобы рисковать и ставить непонятно что, которое неизвестно как будет работать.
    Кому как, а я (с) Мы не ищем лёгких путей!
     
    #262 login999, 13 Aug 2009
    Last edited: 13 Aug 2009
    1 person likes this.
  3. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    Сторонние модули будут всегда, в независимости от того хорошо они написаны или криво, из за того что в стандартную библиотеку по простому все не влезет, да и не надо оно там.

    Это тоже довольно спорно, юзер может даже и не знать что в программе используется тот или иной не стандартный модуль, по простому я могу распространять свою программу с этими модулями.

    Я думаю что люди пишущие модули, вполне способны качественно написать код, тем более если они это пишут не только для себя.

    Вполне известно, например для этой либы в документации есть файлик how-it-works.html где вполне кратко описан алгоритм работы либы (в крайнем случае можно пробежаться по коду).

    С этим согласен, бот должен по возможности состоять только из кода входящего в стандартную библиотеку (для минимизации размера, и возможность запуска в различных средах).

    Еще как вариант, можно использовать вот такой способ:

    Code:
    enc_list=['utf-8', 'windows-1251', 'IBM866']
    
    def try_encoding(text):
        for try_enc in enc_list:
            try:
                unicode(text, try_enc, "strict")
            except:
                pass
            else:
                break
        return try_enc
    
    Правда с 866 он не выдает экзепшен, так что для этой кодировки нужно придумать что ни будь другое.
     
    1 person likes this.
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    __mad К сожалению Universal Detector дает много неправильных срабатываний для достаточно коротких строк. Эксепшн в unicode тоже не панацея. Что ж, придется видимо первыми байтами передавать цифровой код, указывающую на кодировку, в случае отсутствия - переводить в хекс, а дальше пусть на той стороне разбираются
     
    _________________________
  5. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Мб лучше делать все через какой-то специализированный клиент, а юзерам давать возможность указывать кодировку?
    Просто даже если брать консоль, то в виндовой консоли cp866, а в лине обычно utf8, что уже получается хрен знает что.
     
  6. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    how it works - нихера не показатель, я могу тоже много чего наворотить и описать как оно типа должно работать.
    Насчет стандартной библиотеки- не угадали, если взглянуть на тенденции в развитии питона а также на ареал его обитания, то сразу становится ясным что такая вещь была бы очень востребована (python3.1 -возможность указания кодировки при открытии файла, для внутреннего преображения используется utf8, дабы сие чудо работало так как нужно, то оно уже было бы встроенным во внутренности питона), плюс ареал его обитания -от мобильных устройств до Макоси.
    "Люди пищущие модули могут качественно написать код"-далеко не факт, я как и любой другой могу выложить свой код, вот только у меня сомнения в его качестве, уважаемый Gifts в свое время поднимал вопрос по оптимизации xmpp бота на python, ибо жрал он много оперативки, для создания бота использовался xmpppy, что-то мне подсказывает что если бы это было написано им лично, то такой вопрос не ставал бы (имею ввиду модуль для работы с xmpp).
     
  7. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    И часто ли ты встречался с таким кодом (модулями) где автор пишет в описание одно, а код совершенно другой, помойму таки это уже попахивает паранойей. Да, и в мире СПО я с таким ни разу не встречался, обычно если есть какие то проблемы с модулем, о них пишут в секции Know Issue (Bugs, и т.п.), а за показатель качества кода говорит, например, комюнити сформировавшееся вокруг него.

    Возможность указания, и распознавание кодировки - это разные вещи. Но речь не об этом.
    В той мысли я имел ввиду не конкретный модуль, а то что необходимость пользоваться сторонними модулями будет всегда.

    А что ему мешало отрапортовать об проблеме автору бота? Уверен что он бы откликнулся и, возможно, исправил проблему, или же подсказал как это обойти. (В СПО, багрепорты, всегда приветствуются)

    Возможно, но так же могли бы и появится другие проблемы, да и думаю что времени было бы потрачено больше, чем на исправления этой проблемы.
     
    1 person likes this.
  8. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Эхх, это не попахивает, это и есть паранойя и паталогическое недоверие к чужому коду (исключение составляют только действительно серьезные продукты, которые заслужили всеобщее признание и уважение , такие как Джанго, Твистед). Принципиально не использую сторонних модулей и считаю, что стандартной библиотеки питона в повседневной жизни хватает абсолютно с головой, для серьезных же проектов код пишется свой от А до Я (исключения из этого правила смотри выше). Если бы модуль автоматического определения кодировки работал исправно, то он бы давно уже был в стандартной поставке(хотя это может быть и только мое ИМХО). Необходимость использования сторонних модулей (не путать с фреймворками, см выше) стоит только для тех кто не хочет хотя бы на необходимом ему уровне разобраться с тем, чем он собрался оперировать, я же считаю неприемлимым для программиста работать с чем либо, не понимая КАК оно работает. Хотя в принципе я не программист, так что хз как там у кодеров принято...
    =============================================
    P.S> Забыл добавить - я мудак и ламо
     
    #268 login999, 14 Aug 2009
    Last edited: 14 Aug 2009
    1 person likes this.
  9. Tombik

    Tombik Banned

    Joined:
    21 Dec 2008
    Messages:
    18
    Likes Received:
    85
    Reputations:
    13
    Почему не работает?((

    Code:
    #!/usr/bin/env python 
    # Gmail Account Checker   
     
    import sys, poplib 
     
    def printHelp(): 
        print '\nUsage: ./gmailcheck.py <emaillist>' 
        print 'Example: ./gmailcheck.py emails.txt' 
        print '\nNote: The accounts must be in the following format: [email protected]:password\n' 
     
     
    print ''' 
    \t _____           _ _ 
    \t|   __|_____ ___|_| | 
    \t|  |  |     | .'| | | 
    \t|_____|_|_|_|__,|_|_| 
    \t   Account Checker  
    ''' 
     
    if len(sys.argv) != 2: 
        printHelp() 
        exit(1) 
    ......
    
    
     
    #269 Tombik, 19 Aug 2009
    Last edited: 20 Aug 2009
  10. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Ужоснах )
    Дай попробую угадаю - сие есть творчество Дегидрейта с darkc0de.com ?.
    aka
    Code:
    #d3hydr8[at]gmail[dot]com 
    
    Можно подробнее:
    1. Какая версия питона установлена на той машине, где запускают скрипт.
    2. Трейсбек ошибки (или текстом, или желательно скрин).
    P.S. Желательно также ОС на которой это запускается, если для *nix, то как питон устанавливался (из репов или собирался вручную). И размер файлов которые грузятся в скрипт, ибо валидные акки хранятся в оперативке, и пишутся в файл уже после того как обработаются ВСЕ акки
     
    #270 login999, 19 Aug 2009
    Last edited: 19 Aug 2009
  11. Tombik

    Tombik Banned

    Joined:
    21 Dec 2008
    Messages:
    18
    Likes Received:
    85
    Reputations:
    13
    именно #d3hydr8[at]gmail[dot]com
    запускаю ру, и нихрена не происходит. Открылось - закрылось)
     
  12. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    попробуй запустить его через консоль, и скажи чего оно там выводит, самый простейший вариант - скопировать скрипт в корень диска C, потом зайти в консольку, сделать cd c:, потом имя_скрипта.py, вот ошибку которая вылезет скинешь сюда плиз, и уточни версию питона которая установлена у тебя на машине
     
  13. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Ой, вах-вах-вах, запустил токмо что сам, щас тебе переделаю его так чтоб не исчезал (он написан под Python2.6, поэтому на 3.1 запустить не получится)
     
    1 person likes this.
  14. Tombik

    Tombik Banned

    Joined:
    21 Dec 2008
    Messages:
    18
    Likes Received:
    85
    Reputations:
    13
    как раз 2.6 и установлен, буду оч. благодарен, за переделку)
     
  15. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Code:
    #!/usr/bin/env python 
    # Gmail Account Checker   
     
    import sys, poplib 
     
    def printHelp(): 
        print '\nUsage: ./gmailcheck.py <emaillist>' 
        print 'Example: ./gmailcheck.py emails.txt' 
        print '\nNote: The accounts must be in the following format: [email protected]:password\n' 
     
     
    print ''' 
    \t _____           _ _ 
    \t|   __|_____ ___|_| | 
    \t|  |  |     | .'| | | 
    \t|_____|_|_|_|__,|_|_| 
    \t   Account Checker  
    ''' 
    printHelp() 
    mailfile = raw_input("ENTER NAME OF FILE WITH ACCOUNTS :")
    
    #Change these if needed
    SAVEFILE = 'valid_accounts.txt' 
    HOST = 'pop.gmail.com' 
    PORT = 995 
     
    # Do not change anything below. 
    maillist = mailfile
    valid = [] 
    currline = 0 
     
    try: 
        handle = open(maillist) 
    except: 
        print '\n[-] Could not open the accounts file. Check the file path and try again.' 
        print '\n[-] Quitting ...' 
        exit(1) 
     
    for line in handle: 
        currline += 1 
     
        try: 
            email = line.split(':')[0] 
            password = line.split(':')[1].replace('\n', '') 
        except: 
            print '\n[-] Erroneous account format at line %d.' % currline 
            print '[!] Accounts must be in the following format: [email protected]:password' 
            print '\n[-] Quitting ...' 
            exit(1) 
    ...
    
    Каммент:
    У дегидрейта все скрипты заточены для запуска через командную строку, этому скрипту нужно в качестве парметров передавать имя файла с аккми, т.е вызывать его через командную строку так :имя_скрипта.py имя_файла_с_акками.txt, я тебе пределал так, что он при запуске спросит имя файла с акками, введешь ему и дальше он (если он до сих пор актуален) должен запуститься нормально
     
    #275 login999, 19 Aug 2009
    Last edited: 20 Aug 2009
  16. Tombik

    Tombik Banned

    Joined:
    21 Dec 2008
    Messages:
    18
    Likes Received:
    85
    Reputations:
    13
    так ёпт, там капча вылазит)), а я думаю, чё один не валид прёт, и всё-таки, спс, за старание)
     
  17. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Да не за что, ток он проверяет через pop3, так что про капчу можешь не париться, он неактуален станет, когда гугл начнет банить по айпишнику...
    И еще одно - мне не нравится как там сделана обработка ошибок, любой акк на котором вылезет любая ошибка будет считаться невалидным, короче чекер на 3 балла, дерьмовая обработка ошибок как минимум
    P.P.S> Скопируй переделанный мною скрипт еще раз - добавил чтоб он выводил ошибки во время работы, тогда хоть будешь знать на каком моменте он тормозит
     
    #277 login999, 19 Aug 2009
    Last edited: 19 Aug 2009
  18. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Python 3.1 обновился до Python3.1.1
    changelog
    Радует :
    - Issue #1424152: Fix for http.client, urllib.request to support SSL while
    working through proxy. Original patch by Christopher Li, changes made by
    Senthil Kumaran

    Теперь можно работать с SSL через проксю
     
    1 person likes this.
  19. InFlame

    InFlame Banned

    Joined:
    27 Oct 2008
    Messages:
    207
    Likes Received:
    32
    Reputations:
    0
    Есть следующий код, скрипт должен удалить найденную строку:
    Code:
    for line in open("file.txt","r").readlines():
      if line == "some string":
        # тут надо удалить строку, как это проще всего сделать?
     
    #279 InFlame, 19 Aug 2009
    Last edited: 19 Aug 2009
  20. cr0w

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

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    InFlame

    Проще всего будет те строки, что не надо удалять, записывать в новый файл.
     
    1 person likes this.