使用urlopen()读取特定字节

2024-09-24 16:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 模块文件数据方法readsize字节远程
2条回答

这将适用于许多服务器(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。在

不幸的是,urllib2.urlopen()返回的类似文件的对象实际上没有seek()方法。您需要通过以下方式解决此问题:

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

相关问题 更多 >