Добавление метки времени в файл, загруженный с помощью 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')
Другие вопросы по тегам