2014-05-14 15 views
9

Witam używam tego fragmentu kodu do pobierania plików ze strony internetowej, do tej pory pliki mniejsze niż 1 GB są dobre. Ale zauważyłem plik 1.5GB jest niekompletnażądania response.iter_content() dostaje niekompletny plik (1024 MB zamiast 1,5 GB)?

# s is requests session object 
r = s.get(fileUrl, headers=headers, stream=True) 

start_time = time.time() 
with open(local_filename, 'wb') as f: 
    count = 1 
    block_size = 512 
    try: 
     total_size = int(r.headers.get('content-length')) 
     print 'file total size :',total_size 
    except TypeError: 
     print 'using dummy length !!!' 
     total_size = 10000000 

    for chunk in r.iter_content(chunk_size=block_size): 

     if chunk: # filter out keep-alive new chunks 

      duration = time.time() - start_time 
      progress_size = int(count * block_size) 
      if duration == 0: 
       duration = 0.1 
      speed = int(progress_size/(1024 * duration)) 
      percent = int(count * block_size * 100/total_size) 
      sys.stdout.write("\r...%d%%, %d MB, %d KB/s, %d seconds passed" % 
          (percent, progress_size/(1024 * 1024), speed, duration)) 

      f.write(chunk) 
      f.flush() 
      count += 1 

wykorzystaniem najnowszych żądań 2.2.1 Python 2.6.6, CentOS 6.4 pobieranie plików zawsze zatrzymuje się na 66,7% 1024MB, Czego mi brakuje? wyjście:

file total size : 1581244542 
...67%, 1024 MB, 5687 KB/s, 184 seconds passed 

wydaje generatora zwrócony przez iter_content() uważa, że ​​wszystkie kawałki są pobierane i nie ma błędu. btw część wyjątku nie została uruchomiona, ponieważ serwer zwrócił nagłówek długości treści w odpowiedzi.

+0

dopiskiem "b" = bit, a "B" = bajt (co pewnie masz na myśli) –

+0

@ Jonathon ok ... orz, zaktualizowałem post – Shuman

+0

Co to jest 's' w' s.get (...) '? –

Odpowiedz

2

Sprawdź dokładnie, czy możesz pobrać plik przez wget i/lub dowolną zwykłą przeglądarkę. Może to być ograniczenie na serwerze. Jak widzę kod można pobrać duże pliki (większy niż 1,5 GB)

Aktualizacja: spróbuj odwrócić logikę - zamiast

if chunk: # filter out keep-alive new chunks                                                   
    f.write(chunk)                                                         
    f.flush() 

spróbować

if not chunk: 
    break 

f.write(chunk)                                                         
f.flush() 
+0

właśnie sprawdzane ponownie w Firefox 29, ręczne pobieranie działa, ale za pomocą kodu nie działa. zawsze zatrzymuje się na 1024 MB. – Shuman

Powiązane problemy