2014-05-14 12 views
9

hi i đã sử dụng đoạn mã này để tải xuống tệp từ một trang web, cho đến nay các tệp nhỏ hơn 1GB đều tốt. nhưng tôi nhận thấy một file 1.5GB là không đầy đủyêu cầu response.iter_content() nhận tệp không đầy đủ (1024MB thay vì 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 

sử dụng mới nhất các yêu cầu 2.2.1 python 2.6.6, centos 6.4 tập tin tải về luôn dừng lại ở 66,7% 1024MB, những gì tôi bị mất? đầu ra:

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

có vẻ như các máy phát điện được trả về bởi iter_content() cho rằng tất cả các khối được lấy ra và không có lỗi. btw phần ngoại lệ không chạy, bởi vì máy chủ đã trả về độ dài nội dung trong tiêu đề phản hồi.

+0

Note "b" = bit, trong khi "B" = byte (có lẽ là ý của bạn) –

+0

@Jonathon ok ... orz, tôi đã cập nhật bài đăng – Shuman

+0

's' trong' s.get (...) 'là gì? –

Trả lời

2

Vui lòng kiểm tra kỹ xem bạn có thể tải xuống tệp qua wget và/hoặc bất kỳ trình duyệt thông thường nào không. Nó có thể là hạn chế trên máy chủ. Như tôi thấy mã của bạn có thể tải về các tập tin lớn (lớn hơn sau đó 1.5Gb)

Cập nhật: hãy cố gắng đảo ngược logic - thay vì

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

thử

if not chunk: 
    break 

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

chỉ cần kiểm tra lại trong firefox 29, tải xuống thủ công các công trình, nhưng thông qua mã nó không hoạt động. luôn dừng ở mức 1024 MB. – Shuman

Các vấn đề liên quan