【问题标题】:I am downloading a file using Python urllib2. How do I check how large the file size is?我正在使用 Python urllib2 下载文件。如何检查文件大小?
【发布时间】:2009-10-28 11:19:24
【问题描述】:

如果它很大...然后停止下载? 我不想下载大于 12MB 的文件。

request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()

【问题讨论】:

    标签: python file download urllib2


    【解决方案1】:

    没有必要像bobince 那样直接使用httplib。您可以直接使用 urllib 完成所有这些操作:

    >>> import urllib2
    >>> f = urllib2.urlopen("http://dalkescientific.com")
    >>> f.headers.items()
    [('content-length', '7535'), ('accept-ranges', 'bytes'), ('server', 'Apache/2.2.14'),
     ('last-modified', 'Sun, 09 Mar 2008 00:27:43 GMT'), ('connection', 'close'),
     ('etag', '"19fa87-1d6f-447f627da7dc0"'), ('date', 'Wed, 28 Oct 2009 19:59:10 GMT'),
     ('content-type', 'text/html')]
    >>> f.headers["Content-Length"]
    '7535'
    >>> 
    

    如果您使用 httplib,那么您可能需要实现重定向处理、代理支持以及 urllib2 为您提供的其他好处。

    【讨论】:

      【解决方案2】:

      你可以说:

      maxlength= 12*1024*1024
      thefile= urllib2.urlopen(request).read(maxlength+1)
      if len(thefile)==maxlength+1:
          raise ThrowToysOutOfPramException()
      

      当然,您仍然读取了 12MB 的不需要的数据。如果您想将发生这种情况的风险降到最低,您可以检查 HTTP Content-Length 标头(如果存在)(可能不存在)。但要做到这一点,您需要下拉到 httplib 而不是更通用的 urllib。

      u= urlparse.urlparse(ep_url)
      cn= httplib.HTTPConnection(u.netloc)
      cn.request('GET', u.path, headers= {'User-Agent': ua})
      r= cn.getresponse()
      
      try:
          l= int(r.getheader('Content-Length', '0'))
      except ValueError:
          l= 0
      if l>maxlength:
          raise IAmCrossException()
      
      thefile= r.read(maxlength+1)
      if len(thefile)==maxlength+1:
          raise IAmStillCrossException()
      

      如果您愿意,也可以在要求获取文件之前检查长度。这个和上面基本一样,只是用'HEAD'的方法,而不是'GET'

      【讨论】:

      • 这是一个更好的解决方案,因为 Content-Length 不可靠(可能有人设置错误)
      【解决方案3】:

      您可以先检查 HEAD 请求中的内容长度,但请注意,不必设置此标头 - 请参阅 How do you send a HEAD HTTP request in Python 2?

      【讨论】:

      • 如何检查 HEAD 请求中的内容长度?这是否考虑下载标头?
      • 如果你想使用 urllib/urllib2,做一个 HEAD 请求充其量只是理论上的。这些模块仅支持 GET 和 POST 请求。
      【解决方案4】:

      如果设置了 Content-Length 标头,这将起作用

      import urllib2          
      req = urllib2.urlopen("http://example.com/file.zip")
      total_size = int(req.info().getheader('Content-Length'))
      

      【讨论】:

      • 你不需要 .strip(): 1. getheader() 已经返回剥离版本 2. int() 不关心前导/尾随空格。
      • 另外,如果你不设置默认值,使用int(info().getheader())是没有意义的:int中的ValueError不如req.headers中的KeyError合适(注意: req.info() is req.headers)
      • @Gourneau - 如果指定的 url 是 ftp:// url,这仍然有效吗?
      • @PankajParashar 不,“Content-Length”是从 HTTP 标头中提取的,因此仅适用于 HTTP。尽管stackoverflow.com/a/5241914/56069 这可能是您所需要的
      猜你喜欢
      • 2011-05-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多