使用urlopen()读取特定字节

时间:2014-03-31 23:41:30

标签: python urllib2

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

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

2 个答案:

答案 0 :(得分: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()

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

当它不起作用时,只需在其余部分之前读取第一组字节。

有关详细信息,请参阅Wikipedia Article on HTTP headers

答案 1 :(得分:2)

不幸的是,urllib2.urlopen()返回的类文件对象实际上并没有seek()方法。你需要通过这样做来解决这个问题:

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