Strona 1 z 1

[+][Python] Okreslenie wielkosci pliku podczas pobierania

: 06 marca 2008, 14:18
autor: Teqel
Chcialbym podczas pobierania pliku z sieci dynamicznie okreslac jego wielkosc.
Oczywiscie poberanie pliku odbywa sie przez funkcje pythona.
Chcialem sprobowac stworzyc malego managera, ktory bedzie pokazywal pasek postepu i wlasnie do tego potrzebuje okreslac wielkosc.

: 12 marca 2008, 12:51
autor: db
Zakładam, że pobierasz plik po http.

Kod: Zaznacz cały

db@yennefer:~$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test HTTP/1.0
Host: localhost

HTTP/1.1 200 OK
Date: Wed, 12 Mar 2008 11:50:40 GMT
Server: Apache/2.2.8 (Debian) PHP/5.2.5-3 with Suhosin-Patch
Last-Modified: Wed, 12 Mar 2008 08:26:00 GMT
ETag: "8fc43-62d1-448392fda1600"
Accept-Ranges: bytes
Content-Length: 25297
[...]
W Content-Length masz wielkość pliku, więc zostaje Ci tylko w pętli sprawdzać ile już pobrałeś.

: 12 marca 2008, 17:24
autor: Teqel
ale ile to ma wspolnego z funkcja pythona?
Udalo mi sie rozwiazac moj problem:

Kod: Zaznacz cały

 
import re
import os
import urllib
import shelve
import sqlite3
import pickle

from glob import glob, iglob
from hashlib import md5
from sys import platform, stderr
from time import time
from xml.dom import minidom
from time import time as xtime, sleep


class Downloader(object):
    '''Shows a progress bar for downloads. this is actually useful outside the
    scope of danbooru.py'''
    
    before = .0
    history = []
    cycles = 0
    average = lambda self: sum(self.history) / (len(self.history) or 1)

    def __init__(self, width=55):
        self.width = width
        self.kibi = lambda bits: bits / 2 ** 10
        self.proc = lambda a, b: a / (b * 0.01)

    def retrieve(self, url, destination, callback=None):
        self.size = 0
        xtime()
        try: urllib.urlretrieve(url, destination, self.progress)
        except KeyboardInterrupt:
            print '\nDownload cancelled'
            for i in range(5):
                try:
                    os.remove(destination)
                    break
                except:
                    sleep(.1)
            else: raise
            if callback: callback()
            exit()
        print
        return self.size

    def progress(self, blocks, blocksize, filesize):
        self.cycles += 1
        bits = min(blocks*blocksize, filesize)
        done = self.proc(bits, filesize) if bits != filesize else 100
        bar = self.bar(done)
        if not self.cycles % 3 and bits != filesize:
            now = xtime()
            elapsed = now-self.before
            if elapsed:
                speed = self.kibi(blocksize * 3 / elapsed)
                self.history.append(speed)
                self.history = self.history[-4:]
            self.before = now
        average = round(sum(self.history[-4:]) / 4, 1)
        self.size = self.kibi(bits)
        print '\r[%s] %s KiB/s  ' % (bar, str(average)),

    def bar(self, done):
        span = self.width * done * 0.01
        offset = len(str(int(done))) - .99
        result = ('%d%%' % (done,)).center(self.width)
        return result.replace(' ', '-', int(span - offset))
        
Jak by ktos tez tego szukal.
Pozdrawiam