【问题标题】:Last Modified of file downloaded does not match its HTTP header下载的文件的上次修改与其 HTTP 标头不匹配
【发布时间】:2012-04-27 20:13:11
【问题描述】:

我有一段 Python 代码(无论好坏)检查本地文件与 Web 服务器上的同一文件。如果不存在,则下载它,如果存在,则检查下载文件的 os.stat 上次修改的内容与服务器上同一文件的 HTTP 标头。

问题是,这两个数字似乎不相等,即使它们应该相等。代码如下:

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

在我看来,这两个应该是相同的,但它们却截然不同。本地下载的文件的修改日期实际上是下载到本地机器的日期,而不是服务器上最后修改的日期。

基本上我要做的就是保留文件的本地缓存(在实际应用程序中会是很多文件),如有必要,请下载它。我有一半意识到默认情况下网络代理应该执行此操作,并且我正在运行存储这些文件的基本 WAMP 服务器,但我不确定如何将其应用于我的 PyQt 应用程序。可能有几十个文件需要下载和缓存,其中大约一半很少会更改,因此我正在尝试确定检查和获取这些文件的最快方法。

也许这甚至不是正确的方法,所以如果有(更好/许多其他)方法可以做到这一点,我会全力以赴。

【问题讨论】:

  • 对于“数十”个文件,速度真的不是问题——任何东西都足够快。顺便说一句,如果您想确定更改,也可以散列它们的内容。

标签: python http caching


【解决方案1】:

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

【讨论】:

  • 谢谢,这就行了。还应该注意的是,我获取标题信息的 url 的方式实际上是在下载整个内容,所以我什么也没得到。但是,查看this answer,我能够在不下载整个文件的情况下检索到正确的信息。
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多