当前位置: 首页 > 面试题库 >

如何使用请求衡量下载速度和进度?

都乐逸
2023-03-14
问题内容

我正在requests下载文件,但是对于大文件,我每次都需要检查磁盘上文件的大小,因为我无法以百分比形式显示进度,并且我也想知道下载速度。我该怎么做呢?这是我的代码:

import requests
import sys
import time
import os

def downloadFile(url, directory) :
  localFilename = url.split('/')[-1]
  r = requests.get(url, stream=True)

  start = time.clock()
  f = open(directory + '/' + localFilename, 'wb')
  for chunk in r.iter_content(chunk_size = 512 * 1024) :
        if chunk :
              f.write(chunk)
              f.flush()
              os.fsync(f.fileno())
  f.close()
  return (time.clock() - start)

def main() :
  if len(sys.argv) > 1 :
        url = sys.argv[1]
  else :
        url = raw_input("Enter the URL : ")
  directory = raw_input("Where would you want to save the file ?")

  time_elapsed = downloadFile(url, directory)
  print "Download complete..."
  print "Time Elapsed: " + time_elapsed


if __name__ == "__main__" :
  main()

我认为一种方法是在for循环中每次读取文件并根据标头计算进度百分比Content- Length。但是对于大文件(大约500MB),这将再次成为问题。还有其他方法吗?


问题答案:

参见此处:Python进度栏和下载

我认为代码将是这样,它应该显示 自开始以来平均速度, 以每秒字节数为单位:

import requests
import sys
import time

def downloadFile(url, directory) :
  localFilename = url.split('/')[-1]
  with open(directory + '/' + localFilename, 'wb') as f:
    start = time.clock()
    r = requests.get(url, stream=True)
    total_length = r.headers.get('content-length')
    dl = 0
    if total_length is None: # no content length header
      f.write(r.content)
    else:
      for chunk in r.iter_content(1024):
        dl += len(chunk)
        f.write(chunk)
        done = int(50 * dl / total_length)
        sys.stdout.write("\r[%s%s] %s bps" % ('=' * done, ' ' * (50-done), dl//(time.clock() - start)))
        print ''
  return (time.clock() - start)

def main() :
  if len(sys.argv) > 1 :
        url = sys.argv[1]
  else :
        url = raw_input("Enter the URL : ")
  directory = raw_input("Where would you want to save the file ?")

  time_elapsed = downloadFile(url, directory)
  print "Download complete..."
  print "Time Elapsed: " + time_elapsed


if __name__ == "__main__" :
  main()


 类似资料:
  • 我向服务器发出POST请求以生成CSV文件,POST请求的响应是我要写入文件的CSV数据。 我永远不知道CSV文件的大小(它可以是10MB,100MB或1000MB),因此没有内容长度的头。 我已经编写了一个函数,可以下载并向服务器发出POST请求,生成CSV文件并将响应写入CSV文件。然而,我正在努力与进步吧。 如何添加进度条?

  • 问题内容: 我正在下载软件上的文件,这就是我所得到的,它可以成功下载,并且我也可以取得进展,但是还有1件事我不知道该怎么做。测量下载速度。多谢您的协助。谢谢。这是当前的下载方法代码 问题答案: 用同样的方式测量任何东西。 返回一个a,您可以用它来衡量某件事情需要多长时间: 现在,您拥有读取X字节所需的纳秒数。算一下,就可以确定下载速率。 您很有可能正在寻找每秒字节数。跟踪已读取的字节总数,检查是否

  • 我试图下载一个二进制文件,并将其原始名称保存在磁盘上(linux)。 有什么想法吗?

  • 背景: 我正试图用进度回调将我的旧下载代码从Android中的AsyncTask和HttpUrlConnection迁移到使用Regetfit。但是,我注意到registfit/okhttp默认情况下不提供这样的回调。 我进行了大量搜索,找到了一些方法,包括okhttp的官方解决方案,它是由拦截器和自定义响应体完成的。然而,它们都没有真正满足我的需求。 我想要的是: 这段代码的问题是回调实际上是附

  • 我试图下载和保存图像从网络使用python的模块。 以下是我使用的(工作)代码: 以下是使用

  • 我需要下载一个相当大的(~200MB)文件。我在这里找到了下载和保存文件的方法。如果有一个进度条来知道下载了多少,那就太好了。我找到ProgressBar,但我不知道如何将两者结合起来。 这是我试过的代码,但不起作用。