4

我正在使用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 是我的第一个)所以欢迎任何批评!

4

3 回答 3

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
于 2020-01-05T18:25:19.173 回答
-1

文件名中时间戳的最简单方法是:

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')
于 2013-05-20T13:50:56.823 回答
-1

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)

这会下载一个文件,显示进度并打印标题。使用它来调试您的场景,以找出缓存无法按预期工作的原因。

于 2013-05-20T13:54:11.507 回答