2014-05-14 7 views
9

Hallo ich habe dieses Code-Snippet verwendet, um Dateien von einer Website herunterzuladen, so weit Dateien kleiner als 1 GB sind alle gut. aber ich bemerkte eine 1,5 GB-Datei immer hält bei 66,7% 1024MB,Anfragen response.iter_content() ruft unvollständige Datei (1024 MB statt 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 

mit neuesten Anfragen 2.2.1 Python 2.6.6, CentOS 6.4 der Datei-Download unvollständig ist, was bin ich dabei? die Ausgabe:

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

es scheint, den Generator von iter_content() zurück denkt alle Stücke abgerufen werden und es gibt keine Fehler. Der Ausnahmeteil wurde nicht ausgeführt, da der Server die Inhaltslänge im Antwortheader zurückgegeben hat.

+0

Note "b" = Bit, während "B" = Byte (was wahrscheinlich ist, was du meinst) –

+0

@ Jonathon ok ... orz, ich aktualisierte den Beitrag – Shuman

+0

Was ist das 's' in' s.get (...) '? –

Antwort

2

Bitte überprüfen Sie, ob Sie die Datei über wget und/oder einen normalen Browser herunterladen können. Es könnte eine Einschränkung auf dem Server sein. Wie ich Code sehen Dateien groß herunterladen (größer dann 1,5 Gb)

Update: Sie versuchen, die Logik zu invertieren - statt

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

versuchen

if not chunk: 
    break 

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

nur noch einmal in Firefox 29 überprüft, manuell herunterladen funktioniert, aber über Code funktioniert es nicht. stoppt immer bei 1024 MB. – Shuman

Verwandte Themen