Добавление метки времени в файл, загруженный с помощью urllib.urlretrieve
Я использую urllib.urlretrieve
Чтобы загрузить файлы, я хотел бы добавить что-то, чтобы проверить изменения перед загрузкой. У меня уже есть что-то вроде следующего:
import urllib
urllib.urlretrieve("http://www.site1.com/file.txt", r"output/file1.txt")
urllib.urlretrieve("http://www.site2.com/file.txt", r"output/file2.txt")
В идеале я хотел бы, чтобы скрипт проверял изменения (сравнивал последний измененный штамп?), Игнорировал, если то же самое, и загружал, если новее, мне нужен скрипт, чтобы добавить временную метку к имени файла.
Кто-нибудь может помочь?
Я новичок в программировании (Python - мой первый), поэтому любая критика приветствуется!
2 ответа
К сожалению, в python это сделать довольно сложно, так как вам придется все делать самостоятельно. Дополнительно интерфейс дляurlretrieve
не очень приятно.
Следующий код должен выполнить необходимые шаги (добавить заголовок "If-Modified-Since", если файл существует, и настроить временную метку загруженного файла):
def download_file(url, local_filename):
opener = urllib.request.build_opener()
if os.path.isfile(local_filename):
timestamp = os.path.getmtime(local_filename)
timestr = time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(timestamp))
opener.addheaders.append(("If-Modified-Since", timestr))
urllib.request.install_opener(opener)
try:
local_filename, headers = urllib.request.urlretrieve(url, local_filename, reporthook=status_callback)
if 'Last-Modified' in headers:
mtime = calendar.timegm(time.strptime(headers['Last-Modified'], '%a, %d %b %Y %H:%M:%S GMT'))
os.utime(local_filename, (mtime, mtime))
except urllib.error.HTTPError as e:
if e.code != 304:
raise e
urllib.request.install_opener(urllib.request.build_opener()) # Reset opener
return local_filename
urllib.urlretrieve()
уже делает это для вас. Если имя выходного файла существует, он выполняет все необходимые проверки, чтобы избежать его повторной загрузки.
Но это работает только тогда, когда сервер поддерживает это. Поэтому вы можете распечатать заголовки HTTP (второй результат вызова функции), чтобы узнать, можно ли выполнить кэширование.
Также эта статья может помочь: http://pymotw.com/2/urllib/
У него есть этот код в конце:
import urllib
import os
def reporthook(blocks_read, block_size, total_size):
if not blocks_read:
print 'Connection opened'
return
if total_size < 0:
# Unknown size
print 'Read %d blocks' % blocks_read
else:
amount_read = blocks_read * block_size
print 'Read %d blocks, or %d/%d' % (blocks_read, amount_read, total_size)
return
try:
filename, msg = urllib.urlretrieve('http://blog.doughellmann.com/', reporthook=reporthook)
print
print 'File:', filename
print 'Headers:'
print msg
print 'File exists before cleanup:', os.path.exists(filename)
finally:
urllib.urlcleanup()
print 'File still exists:', os.path.exists(filename)
Это загружает файл, показывает прогресс и печатает заголовки. Используйте его для отладки вашего сценария, чтобы выяснить, почему кэширование не работает так, как вы ожидаете.
Самый простой подход для отметки времени в имени файла:
import time
'output/file_%d.txt' % time.time()
Человек читается так:
from datetime import datetime
n = datetime.now()
n.strftime('output/file_%Y%m%d_%H%M%S.txt')