使用urlopen()读取特定字节

1 投票
2 回答
1583 浏览
提问于 2025-04-18 00:45

我想用一个Python模块从远程文件中读取特定的字节。我正在使用urllib2。这里的特定字节是指以OffsetSize的形式来表示的字节。我知道我们可以通过urlopen(link).read(X)从远程文件中读取X个字节。那么有没有办法让我读取从Offset开始,长度为Size的数据呢?

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

2 个回答

2

很遗憾,使用urllib2.urlopen()返回的这个类似文件的对象其实没有seek()这个方法。你需要通过其他方式来解决这个问题,比如这样做:

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

这个方法适用于很多服务器(比如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()

需要注意的是,这种方法的好处在于服务器不需要发送你不需要或不想要的数据,而你也不会下载这些数据。如果你只想从一个大文件中获取少量数据,这样可以节省很多带宽。

如果这个方法不管用,你可以先读取文件的前几字节,然后再读取后面的内容。

想了解更多细节,可以查看维基百科关于HTTP头部的文章

撰写回答