【问题标题】:Read specific bytes using urlopen()使用 urlopen() 读取特定字节
【发布时间】:2014-03-31 23:41:30
【问题描述】:

我想使用 python 模块从远程文件中读取特定字节。我正在使用 urllib2。感知字节中的特定字节,格式为Offset,Size。我知道我们可以使用urlopen(link).read(X) 从远程文件中读取 X 个字节。有什么方法可以让我读取从Offset 开始、长度为Size.的数据?

def readSpecificBytes(link,Offset,size):
# code to be written

【问题讨论】:

标签: python urllib2


【解决方案1】:

这适用于许多服务器(Apache 等),但并不总是有效,尤其是。不适用于 CGI 等动态内容(*.php、*.cgi 等):

import urllib2
def get_part_of_url(link, start_byte, end_byte):
    req = urllib2.Request(link)
    req.add_header('Range', 'bytes=' + str(start_byte) + '-' + str(end_byte))
    resp = urllib2.urlopen(req)
    content = resp.read()

请注意,这种方法意味着服务器永远不必发送并且您永远不会下载您不需要/不想要的数据,如果您只需要少量的数据,这可以节省 带宽来自大文件的数据。

当它不起作用时,只需先读取第一组字节,然后再读取其余字节。

更多详情请见Wikipedia Article on HTTP headers

【讨论】:

    【解决方案2】:

    不幸的是,由 urllib2.urlopen() 返回的 file-like 对象实际上没有seek() 方法。您需要通过执行以下操作来解决此问题:

    def readSpecificBytes(link,Offset,size):
        f = urllib2.urlopen(link)
        if Offset > 0:
            f.read(Offset)
        return f.read(size)
    

    【讨论】:

    • 请注意,对于非常大的文件,这将是一种相当昂贵的方法。到目前为止,您必须下载所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多