【问题标题】:How to Download only the first x bytes of data Python如何仅下载前 x 个字节的数据 Python
【发布时间】:2018-01-15 06:34:45
【问题描述】:

情况:要下载的文件是一个大文件(>100MB)。这需要相当长的时间,尤其是在互联网连接速度较慢的情况下。

问题:但是,我只需要文件头(前 512 个字节),它将决定是否需要下载整个文件。

问题:有没有办法只下载文件的前 512 个字节?

补充信息:目前在Python2.7中使用urllib.urlretrieve完成下载

【问题讨论】:

  • 我会将wget 拆开并修改它,使其在结束前停止。
  • 你可以使用 HTTP HEAD 方法吗?只返回标题。
  • @user2896976 我相信这些是针对 HTTP 标头的?我需要文件头,它位于文件的前 512 个字节中。
  • @Jean-FrançoisFabre 也很想这样做,但以我的技能,我想我会在完成之前被老师谋杀哈哈哈。不过谢谢 - 没想到

标签: python python-2.7 download urllib urlretrieve


【解决方案1】:

我认为curlhead 会比这里的 Python 解决方案更好:

curl https://my.website.com/file.txt | head -c 512 > header.txt

编辑:另外,如果你绝对必须在 Python 脚本中使用它,你可以使用 subprocess 来执行 curl 管道到 head 命令执行

编辑 2:对于完全 Python 解决方案:urlopen 函数(Python 2 中的 urllib2.urlopen 和 Python 3 中的 urllib.request.urlopen)返回一个类似文件的流,您可以在该流上使用 read 函数,它允许您指定字节数。比如urllib2.urlopen(my_url).read(512)会返回my_url的前512字节

【讨论】:

  • 啊,是的。编辑是我需要的。但是没有 Python 模块可以做到这一点?
  • urlopen 函数(Python 2 中的 urllib2.urlopen 和 Python 3 中的 urllib.request.urlopen)返回一个类似文件的流,您可以在该流上使用 read 函数,它允许您指定字节数。例如,urllib2.urlopen(my_url).read(512) 将返回 my_url 的前 512 个字节。但是,我不确定这会下载 512 个字节,或者它是否会尝试在幕后下载整个文件并仅返回前 512
  • 评论中的那个有效。你想替换它并让我接受作为答案吗?
  • 我可以补充一点,urllib 也有相同的模块。如果您选择减少要导入的库的数量。 (我已经导入了urllib,其实很犹豫导入urllib2
【解决方案2】:

如果您尝试读取的 url 以 Content-Length 标头响应,那么您可以在 Python 2 中使用 urllib2 获取文件大小。

def get_file_size(url):
    request = urllib2.Request(url)
    request.get_method = lambda : 'HEAD'
    response = urllib2.urlopen(request)
    length = response.headers.getheader("Content-Length")
    return int(length)

可以调用该函数获取长度并与某个阈值进行比较来决定是否下载。

if get_file_size("http://stackoverflow.com") < 1000000:
    # Download

(注意 Python 3 的实现略有不同:)

from urllib import request

def get_file_size(url):
    r = request.Request(url)
    r.get_method = lambda : 'HEAD'
    response = request.urlopen(r)
    length = response.getheader("Content-Length")
    return int(length)

【讨论】:

  • 喜欢这个想法,但我需要比较文件头中存在的哈希值。文件大小可以相同,但内容可能不同。因此,哈希值作为检查比文件大小更可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多