Как я ищу на особую позицию по удаленному (HTTP) файл, таким образом, я могу загрузить только ту часть?
Позволяет говорят, что байты на удаленном файле были: 1234567890
Я хочу искать на 4 и загрузить 3 байта оттуда, таким образом, я имел бы: 456
и также, как я проверяю, существует ли удаленный файл? Я попробовал, os.path.isfile (), но это возвращает False, когда я передаю удаленный URL файла.
Если вы загружаете удаленный файл по HTTP, вам нужно установить заголовок Range
.
Проверьте в этом примере, как это можно сделать. Похоже на то:
myUrlclass.addheader("Range","bytes=%s-" % (existSize))
EDIT: Я только что нашел лучшую реализацию. Этот класс очень прост в использовании, как видно из документации.
class HTTPRangeHandler(urllib2.BaseHandler):
"""Handler that enables HTTP Range headers.
This was extremely simple. The Range header is a HTTP feature to
begin with so all this class does is tell urllib2 that the
"206 Partial Content" reponse from the HTTP server is what we
expected.
Example:
import urllib2
import byterange
range_handler = range.HTTPRangeHandler()
opener = urllib2.build_opener(range_handler)
# install it
urllib2.install_opener(opener)
# create Request and set Range header
req = urllib2.Request('http://www.python.org/')
req.header['Range'] = 'bytes=30-50'
f = urllib2.urlopen(req)
"""
def http_error_206(self, req, fp, code, msg, hdrs):
# 206 Partial Content Response
r = urllib.addinfourl(fp, hdrs, req.get_full_url())
r.code = code
r.msg = msg
return r
def http_error_416(self, req, fp, code, msg, hdrs):
# HTTP's Range Not Satisfiable error
raise RangeError('Requested Range Not Satisfiable')
Update: Лучшая реализация" переместилась в github: excid3/urlgrabber в файле byterange.py.
.AFAIK, это невозможно с помощью fseek() или подобного рода. Для этого необходимо использовать заголовок диапазона HTTP Range. Этот заголовок может поддерживаться или не поддерживаться сервером, поэтому ваш пробег может отличаться.
import urllib2
myHeaders = {'Range':'bytes=0-9'}
req = urllib2.Request('http://www.promotionalpromos.com/mirrors/gnu/gnu/bash/bash-1.14.3-1.14.4.diff.gz',headers=myHeaders)
partialFile = urllib2.urlopen(req)
s2 = (partialFile.read())
EDIT: Это, конечно, предполагает, что под удаленным файлом вы подразумеваете файл, хранящийся на HTTP-сервере...
Если файл, который вам нужен, находится на FTP-сервере, FTP позволяет указать только смещение start, а не диапазон. Если это то, что вы хотите, то следующий код должен сделать это (не тестировался!)
import ftplib
fileToRetrieve = 'somefile.zip'
fromByte = 15
ftp = ftplib.FTP('ftp.someplace.net')
outFile = open('partialFile', 'wb')
ftp.retrbinary('RETR '+ fileToRetrieve, outFile.write, rest=str(fromByte))
outFile.close()