Python只请求一定数量的字节

Posted

技术标签:

【中文标题】Python只请求一定数量的字节【英文标题】:Python request only a certain number of bytes 【发布时间】:2021-12-23 16:06:39 【问题描述】:

我正在从 URL 请求 GIF 文件,并且我试图通过仅读取第一帧的字节来避免下载整个文件。有没有办法使用 requests 或 urllib.request 模块,只允许您请求/下载一定数量的字节?

import requests

r = requests.get("https://cdn.discordapp.com/attachments/712243005519560736/908229068909068318/sample_1.gif")

【问题讨论】:

【参考方案1】:

你可以尝试先打开图片使用img.n_frames

from io import BytesIO
from PIL import Image
img = Image.open(BytesIO(r.content))
img.n_frames

输出

1

【讨论】:

【参考方案2】:

您可以使用requests.Response.iter_content 来迭代响应数据。

读取前 10 个字节以提取宽度和 GIF 图片的高度:

测试:

import struct

import requests

URL = "https://cdn.discordapp.com/attachments/712243005519560736/908229068909068318/sample_1.gif"


def main():
    with requests.get(URL, stream=True) as r:
        header = next(r.iter_content(chunk_size=10))
        typ, version, width, height = struct.unpack("<3s3sHH", header)

        print(typ, version, width, height)


if __name__ == "__main__":
    main()

测试:

$ python test.py 
b'GIF' b'89a' 10 10

使用这种方法,您当然需要知道字节偏移量 和您要阅读的框架的大小。

【讨论】:

以上是关于Python只请求一定数量的字节的主要内容,如果未能解决你的问题,请参考以下文章

阻塞 recv() 返回小于请求字节的情况

Python 的 os.path.getsize() 是不是具有真正的字节分辨率?

Nginx 限制ip并发数及请求速度

基准缓存字典导致“读取字节时出现意外的 EOF”

python 序列化和反序列化

将 python x509 签名请求对象 (x509.CertificateSigningRequest) 对象转换为字节