使用urlopen()读取特定字节
我想用一个Python模块从远程文件中读取特定的字节。我正在使用urllib2。这里的特定字节是指以Offset
和Size
的形式来表示的字节。我知道我们可以通过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头部的文章。