将时间戳添加到使用urllib.urlretrieve下载的文件

时间:2013-05-20 13:26:38

标签: python urllib

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

3 个答案:

答案 0 :(得分:1)

不幸的是,这在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

答案 1 :(得分:0)

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

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')

答案 2 :(得分:-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)

下载文件,显示进度并打印标题。使用它来调试您的场景,找出为什么缓存不能按预期工作。