我正在使用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是我的第一个)所以任何批评欢迎!
答案 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)
下载文件,显示进度并打印标题。使用它来调试您的场景,找出为什么缓存不能按预期工作。