我有一段Python代码(无论好坏)根据Web服务器上的同一文件检查本地文件。如果它不存在,则下载它,如果是,它会根据服务器上同一文件的HTTP头检查下载文件的os.stat
最后一次修改。
问题是,这两个数字似乎不相等,即使它们应该是。这是代码:
from urllib import urlretrieve
from urllib2 import Request, urlopen
from time import strftime, localtime, mktime, strptime
from os import stat, path
destFile = "logo3w.png"
srvFile = "http://www.google.com/images/srpr/logo3w.png"
if path.exists(destFile):
localLastModified = stat(destFile).st_mtime
req = Request(srvFile)
url_handle = urlopen(req)
headers = url_handle.info()
srvLastModified = headers.getheader("Last-Modified")
srvLastModified = mktime(strptime(srvLastModified,
"%a, %d %b %Y %H:%M:%S GMT"))
print localLastModified, srvLastModified
else:
urlretrieve(srvFile, destFile)
print
语句的返回(如果您运行代码两次)是1334527395.26 1333350817.0
。
在我看来,这两者应该是一样的,但它们却截然不同。本地下载的文件的修改日期实际上是下载到本地计算机的日期,而不是服务器上的最后修改日期。
基本上我所要做的就是保留文件的本地缓存(在实际应用程序中会有很多文件),必要时下载它。我有一半意识到Web代理应该默认执行此操作,并且我正在运行存储这些文件的基本WAMP服务器,但我不确定如何将其应用于我的PyQt应用程序。可能有数十个文件需要下载和缓存,其中大约一半很少会发生变化,因此我正在尝试确定检查和获取这些文件的最快方法。
也许这甚至不是正确的方法,所以如果有更好的/更多的其他方法,我会全力以赴。
答案 0 :(得分:4)
urllib.urlretrieve
只需下载文件;它不会复制修改日期。您必须使用os.utime
手动执行此操作:
import os
# current code
else:
headers = urlretrieve(srvFile, destFile)[1]
lmStr = headers.getheader("Last-Modified")
srvLastModified = mktime(strptime(lmStr, "%a, %d %b %Y %H:%M:%S GMT"))
os.utime(destFile, (srvLastModified, srvLastModified))