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

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

  1. FewG

    FewG Member

    Joined:
    25 Dec 2009
    Messages:
    136
    Likes Received:
    12
    Reputations:
    0
    New То?

    Code:
    from ftplib import FTP
    from sys import exit, stdout
    from time import time
    from random import choice
    from os import remove
    
    FTPHOST = "127.0.0.1"
    FTPUSER = "username"
    FTPPASSWD = "password"
    
    SIZE = 100 # in MB
    
    def createFile(size):
    
        kb_buffer = "w"
        s = "abcdefghijklmnopqrstuvwxyz1234567890"
    
        for i in range(1024):
            kb_buffer += "w"
    
        filename = "".join([ choice(s) for i in range(8) ]) + ".txt"
    
        x = open(filename, "w")
        for i in range(size * 1024):
            x.write(kb_buffer)
    
        x.close()
        return filename
    
    def getFileName(ftp, filename, outfile=None):
    
        if outfile is None:
            outfile = stdout
    
        ftp.retrlines("RETR " + filename, lambda s, w=outfile.write: w(s + "\n"))
    
    def main():
    
            print ("[+] Connecting to " + FTPHOST + "..")
            try:
                ftp = FTP(FTPHOST)
                print ("[+] Connection established")
            except:
                print ("[-] Error while connecting")
                ftp.quit()
                exit(0)
    
            print ("[+] Logging in..")
            try:
                ftp.login(FTPUSER, FTPPASSWD)
                print ("[+] Successfully logged in")
            except:
                print ("[-] Not logged in")
                ftp.quit()
                exit(0)
    
            print ("[+] Sending File..")
            filename = createFile(SIZE)
            try:
                f = open(filename, "rb")
                begin_transfer = time()
                ftp.storlines("STOR " + filename, f)
                end_transfer = time()
                f.close()
                print ("[+] File successfully sent")
                UploadTime = end_transfer - begin_transfer
                print ("[+] File sending took " + str(UploadTime)[:4] + " Seconds")
            except:
                print ("[-] Error while sending")
                ftp.quit()
                f.close()
                exit(0)
                
            print ("[+] Receiving File..")
            remove(filename)
            try:
                f = open(filename, "w")
                begin_transfer = time()
                getFileName(ftp, filename, f)
                end_transfer = time()
                print ("[+] File successfully received")
                DownloadTime = end_transfer - begin_transfer
                print ("[+] File receive took " + str(DownloadTime)[:4] + " Seconds")
            except:
                print ("[-] Error while receiving")
                ftp.quit()
                f.close()
                exit(0)
                
            UL_Speed = (SIZE * 1024) / UploadTime
            DL_Speed = (SIZE * 1024) / DownloadTime
    
            print ()
            print ("Upload Speed:       " + str(UL_Speed)[:4] + " kB/s")
            print ("Download speed:     " + str(DL_Speed)[:4] + " kB/s")
    
    if __name__ == "__main__": main()
    
     
    #821 FewG, 26 Mar 2011
    Last edited: 26 Mar 2011
  2. 0xJah

    0xJah New Member

    Joined:
    23 Feb 2011
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    -*- del -*-
     
    #822 0xJah, 26 Mar 2011
    Last edited: 26 Mar 2011
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    0xJah пользуйтесь модулем urllib2
     
    _________________________
  4. 0xJah

    0xJah New Member

    Joined:
    23 Feb 2011
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Вот знал, что кто-нибудь да скажет это :)

    Собственно вопрос отпадает ввиду возможности парсинга заголовка Content-Length ответа.

    А лучше даже циклом получать данные пока не будет достигнут конец.
     
    #824 0xJah, 26 Mar 2011
    Last edited: 26 Mar 2011
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    0xJah
    Рад, что не разочаровал, но не переносите привычку выработанную в си/дельфи в питон, плохо это
    если сервер отправляет данные чанками - заголовка не будет, и там свои особенности
    Все бы хорошо, если все веб-серверы подчинялись заголовку Connection: Close - Может случиться ситуация, что поток/программа будут зависать, пока не выскочит исключение таймаута.
     
    _________________________
  6. 0xJah

    0xJah New Member

    Joined:
    23 Feb 2011
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Да это не привычка :)
    Я уже написал то, что мне нужно с использованием urllib, но при тестировании программы были обнаружены ошибки и было принято решение, что легче будет всё это дело переписать с использованием сокетов, нежели заточить под urllib.

    Кхм... Наверно в моей ситуации так и есть, хотя я не уверен.
    Если смотрю ответ с помощью firebug, то там этот заголовок есть, но если же обращаюсь из скрипта, то в ответе этого заголовка не наблюдаю.

    Только что задействовал цикл в получении полного ответа, собственно так и получилось. Всё на время подвисает.

    Но всё же должен быть нормальный вариант для решения моей задачи без использования urllib.
     
  7. cepera666

    cepera666 New Member

    Joined:
    22 Jan 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    наверное, супер-тупой вопрос, но почему-то не получается.
    насколько я понял, чтобы русский текст работал, нужно делать так:
    Code:
    # -*- coding:<utf-8> -*- 
    print "ащащащ";
    
    выдает:
    Code:
    SyntaxError: Non-ASCII character '\xd0' 
     
    как это правильно сделать?

    Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)
    [GCC 4.4.5] on linux2, netbeans 6.9.1

    upd: если из терминала, всё ок,
     
    #827 cepera666, 31 Mar 2011
    Last edited: 31 Mar 2011
  8. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Вот так.
    # python 3
    # -*- coding: utf-8 -*-
    url = "ататат!"
    print(url)
     
  9. cepera666

    cepera666 New Member

    Joined:
    22 Jan 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    спасибо!
     
  10. K800

    K800 Nobody's Fool

    Joined:
    25 Dec 2010
    Messages:
    2,191
    Likes Received:
    3,828
    Reputations:
    372
  11. Megido

    Megido New Member

    Joined:
    3 Jun 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    0
    Я создаю сокет
    irc0 = socket.socket( socket.AF_INET, socket.SOCK_STREAM,0)
    Затем ним же соединяюсь серваком
    Ну и принимаю данные

    Затем повторяю все это с другим сокетом
    irc1 = socket.socket( socket.AF_INET, socket.SOCK_STREAM,0)

    Почему сокет кидает ошибки вроди пермишн дениед?
    Тобиш нормально принимать данные с 2 серверов невыходит, они либо идут вместе либо вобще неприходят
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Megido код или полный текст ошибки в студию. Тут все работает:
    Code:
    import socket
    
    irc1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
    irc1.connect(('ya.ru', 80))
    irc1.send('''GET / HTTP/1.1\r\nHost: ya.ru\r\nConnection: Close\r\n\r\n''')
    print irc1.recv(8192)
    irc1.close()
    
    
    irc2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
    irc2.connect(('ya.ru', 80))
    irc2.send('''GET / HTTP/1.1\r\nHost: ya.ru\r\nConnection: Close\r\n\r\n''')
    print irc2.recv(8192)
    irc2.close()
     
    _________________________
  13. Megido

    Megido New Member

    Joined:
    3 Jun 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    0
    Не отослал принял а постоянно принимая данные, так как ты написал работать будет. Но только первое сообщение
     
  14. Megido

    Megido New Member

    Joined:
    3 Jun 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    0
    data=string.split(unicode(vars.irc0.recv(4096)),'\r\n')
    File "e:/resource/socket.py", line 353, in recv
    socket.error: (13, 'Permission denied')
     
  15. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Megido как вы подключаетесь к серверу, что у вас происходит с этим сокетом от момента создания, до этой ошибки?

    Возможно вы, по неизвестной мне причине, пытаетесь биндить один и тот же локальный порт?
     
    _________________________
  16. Megido

    Megido New Member

    Joined:
    3 Jun 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    0
    Я не юзаю бинд
     
  17. !Knyaz2010!

    !Knyaz2010! Member

    Joined:
    24 Jun 2010
    Messages:
    57
    Likes Received:
    5
    Reputations:
    5
    Скажите пожалуйста - мне задали такое задание: надо на питоне вичеслить сколько комбинаций можно сделать с монет номиналом 1 2 5 25 и 50 коп, чтобы в суме получилось 100 коп, тоесть гривна (или рубль =) ). Пробывал делать это разными способами и ничего не получилось. Чтобы вы не думали, что я ищу готовое решение я покажу что я что то уже пробывал, но я только начал изучать этот язык:

    Code:
    
    a=1
    t=2
    c=5
    d=25
    e=50
    suma=100
    plusb=0
    plusc=0
    plusd=0
    pluse=0
    x=0
    def parametry(num):
        if(num==t):
            x=t
            plusb = 1
            plusc = 0
            plusd = 0
            pluse = 0
        
        if(num==c):
            plusb = 0
            plusc = 1
            plusd = 0
            pluse = 0
           
        if(num==d):
            plusb = 0
            plusc = 0
            plusd = 1
            pluse = 0
            
        if(num==e):
            plusb = 0
            plusc = 0
            plusd = 0
            pluse = 1
        return plusb,plusc,plusd,pluse,x
    k_mas=['1111','1110','1101','1100','1011','1010','1001','1000','0111','0110','0101','0100','0011','0010','0001']
    
    def break_mas(k_mas,maska,plusb,plusc,plusd,pluse,x):
        b=1
        total=0
        for i in k_mas[maska]:
            
            if b==1:
                i1=int(i)
            elif b==2:
                i2=int(i)
            elif b==3:
                i3=int(i)
            else:
                i4=int(i)
            b+=1
        
        count=1
        countb=1
        countc=1
        countd=1
        counte=1
        
        if i1==1:
            b1=t
        else:
            b1=0
        if i2==1:
            c1=c
        else:
            c1=0
        if i3==1:
            d1=d
        else:
            d1=0
        if i4==1:
            e1=e
        else:
            e1=0
        
          
        while (suma-b1*countb-c1*countc-d1*countd-e1*counte)>=0:
            if (x==t)and(b1==0):
                return
            #print(suma-b1*countb-c1*countc-d1*countd-e1*counte)
            result=suma-b1*countb-c1*countc-d1*countd-e1*counte
            countb+=plusb
            countc+=plusc
            countd+=plusd
            counte+=pluse
            count+=1        
            total+=count
        return total
        
    
    n=0
    total_change=0
    
    while n<=7:
        pl=parametry(t)
        total_change+=break_mas(k_mas,n,pl[0],pl[1],pl[2],pl[3],pl[4])
        n+=1
    print(total_change)
    
    



    Здесь я пробывал использовать маски (15 штук), но как только маска начинаеться на 0, сразу выдает ошибку. Возможно я не в том направлении ищу или что то не то делаю? Подскажите пожалуйста как правильно... Буду очень благодарен! Если всё получится, тому кто найболее помог с меня "+"!!! Спасибо всем зарание!
     
  18. FewG

    FewG Member

    Joined:
    25 Dec 2009
    Messages:
    136
    Likes Received:
    12
    Reputations:
    0
    Писал быстро, для оптимизации открытый лес, но всё же можно посмотреть какие есть возможности реализации вашей проблемы. Тестил для MAX=20, ибо для 100 ну уж очень много комбинаций. :D

    Code:
    A = 1
    B = 2
    C = 5
    D = 25
    E = 50
    
    MIN = 0
    MAX = 10
    
    RESULT = 0
    
    value1 = MIN
    value2 = MIN
    value3 = MIN
    value4 = MIN
    value5 = MIN
    
    
    print("[+] Initializing...")
    while value5 <= MAX:
    
    	if (value1 * A + value2 * B + value3 * C + value4 * D + value5 * E == MAX) :
    		RESULT += 1
    		print("+1 combination")
    		f = open("combinations.txt", "a")
    		result2txt = str(A) + " (" + str(value1) + ") + " + str(B) + " (" + str(value2) + ") + " + str(C) + " (" + str(value3) + ") + " + str(D) + " (" + str(value4) + ") + " + str(E) + " (" + str(value5) + ")" + "\n"
    		f.write(result2txt)
    		f.close()
    		value1 += 1
    		if value1 > MAX // A:
    			value1 = 0
    			value2 += 1
    			if value2 > MAX // B:
    				value2 = 0
    				value3 += 1
    				if value3 > MAX // C:
    					value3 = 0
    					value4 += 1
    					if value4 > MAX // C:
    						value4 = 0
    						value5 += 1
    						if value5 > MAX // E:
    							break
    	else:
    		value1 += 1
    		if value1 > MAX // A:
    			value1 = 0
    			value2 += 1
    			if value2 > MAX // B:
    				value2 = 0
    				value3 += 1
    				if value3 > MAX // C:
    					value3 = 0
    					value4 += 1
    					if value4 > MAX // D:
    						value4 = 0
    						value5 += 1
    						if value5 > MAX // E:
    							break
    print("Es gibt insgesamt " + str(RESULT) + " Möglichkeiten")
    Результат таков:

    Code:
    [+] Initializing...
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    +1 combination
    Es gibt insgesamt 10 Möglichkeiten
    Code:
    1 (10) + 2 (0) + 5 (0) + 25 (0) + 50 (0)
    1 (8) + 2 (1) + 5 (0) + 25 (0) + 50 (0)
    1 (6) + 2 (2) + 5 (0) + 25 (0) + 50 (0)
    1 (4) + 2 (3) + 5 (0) + 25 (0) + 50 (0)
    1 (2) + 2 (4) + 5 (0) + 25 (0) + 50 (0)
    1 (0) + 2 (5) + 5 (0) + 25 (0) + 50 (0)
    1 (5) + 2 (0) + 5 (1) + 25 (0) + 50 (0)
    1 (3) + 2 (1) + 5 (1) + 25 (0) + 50 (0)
    1 (1) + 2 (2) + 5 (1) + 25 (0) + 50 (0)
    1 (0) + 2 (0) + 5 (2) + 25 (0) + 50 (0)
    P.S. Изменен алгоритм на более точный.
     
    #838 FewG, 10 Apr 2011
    Last edited: 10 Apr 2011
    1 person likes this.
  19. !Knyaz2010!

    !Knyaz2010! Member

    Joined:
    24 Jun 2010
    Messages:
    57
    Likes Received:
    5
    Reputations:
    5
    Хорошая идея, немного оптимизировал и получилось примерно 1200 вариантов! Правда не знаю правильно ли это))) ну как я и обещал с меня награда! Спасибо большое за помощь!
     
  20. FewG

    FewG Member

    Joined:
    25 Dec 2009
    Messages:
    136
    Likes Received:
    12
    Reputations:
    0
    Да, около того - 1232 комбинации.