如何在Python中获取链接文件的大小而无需下载它?

14 浏览
0 Comments

如何在Python中获取链接文件的大小而无需下载它?

我有一个链接列表,我想获取每个文件的大小,以确定每个文件需要多少计算资源。是否可以通过发送一个GET请求或类似的方式来获取文件大小?\n以下是其中一个链接的示例:https://sra-download.ncbi.nlm.nih.gov/traces/sra46/SRR/005150/SRR5273887\n谢谢。

0
0 Comments

问题的出现原因是需要在不下载文件的情况下获取文件大小。解决方法是使用Python的urllib.request库中的urlopen函数,并通过获取返回的HTTP响应头信息中的Content-Length属性来获取文件大小。

以下是解决方法的具体代码:

from urllib.request import urlopen
link =  "https://sra-download.ncbi.nlm.nih.gov/traces/sra46/SRR/005150/SRR5273887"
site = urlopen(link)
meta = site.info()
print(meta)

运行以上代码将输出以下内容:

Server: nginx

Date: Mon, 18 Mar 2019 17:02:40 GMT

Content-Type: application/octet-stream

Content-Length: 578220087

Last-Modified: Tue, 21 Feb 2017 12:13:19 GMT

Connection: close

Accept-Ranges: bytes

其中的Content-Length属性即为文件的大小,以字节为单位。

需要注意的是,虽然使用urlopen函数不会实际下载文件,但它会发送一个GET请求,因此可能会产生一些网络流量。

0
0 Comments

问题的原因是需要在不下载文件的情况下获取链接的文件大小。解决方法是使用"HEAD"方法,并使用Python的requests库来发送HTTP请求。

以下是解决问题的代码:

#!/usr/bin/env python
# display URL file size without downloading
import sys
import requests
# pass URL as first argument
response = requests.head(sys.argv[1], allow_redirects=True)
size = response.headers.get('content-length', -1)
# size in megabytes (Python 2, 3)
print('{:<40}: {:.2f} MB'.format('FILE SIZE', int(size) / float(1 << 20)))
# size in megabytes (f-string, Python 3 only)
# print(f"{'FILE SIZE':<40}: {int(size) / float(1 << 20):.2f} MB")

另外,如果需要使用Python 2的标准库来解决问题,可以参考"How do you send a HEAD HTTP request in Python 2?"这个链接。

0
0 Comments

在Python中,如何在不下载文件的情况下获取链接的文件大小?

要做到这一点,可以使用HTTP HEAD方法,该方法只会获取URL的头信息,而不会像HTTP GET请求那样下载内容。

文件大小在'Content-Length'头部中。在Python 3.6中可以这样实现:

import urllib
req = urllib.request.Request('https://sra-download.ncbi.nlm.nih.gov/traces/sra46/SRR/005150/SRR5273887', 
                             method='HEAD')
f = urllib.request.urlopen(req)
f.status
f.headers['Content-Length']

注意,如果远程服务器没有实现head方法,仍然可以通过在python的requests库中使用stream = True选项来实现类似的功能,如stackoverflow.com/a/44299915中所述,然后在获取头部后直接关闭每个请求。

0