我想使用python模块从远程文件中读取特定字节。我正在使用urllib2。感知字节中的特定字节,格式为Offset
,Size
。我知道我们可以使用urlopen(link).read(X)
从远程文件中读取X个字节。有什么方法可以读取从Offset
长Size
开始的数据。?
def readSpecificBytes(link,Offset,size):
# code to be written
答案 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)