2

(良くも悪くも)ローカルファイルをWebサーバー上の同じファイルと照合するPythonコードがあります。存在しない場合はダウンロードし、存在しない場合はos.stat、ダウンロードしたファイルの最終変更をサーバー上の同じファイルのHTTPヘッダーと照合します。

問題は、これらの2つの数値は、あるべき場合でも等しくないように見えることです。コードは次のとおりです。

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(コードを2回実行した場合)は1334527395.26 1333350817.0です。

私には、これら2つは同じである必要があるように見えますが、大きく異なります。ローカルにダウンロードされたファイルの変更日は、実際にはローカルマシンにダウンロードされた日付であり、サーバーで最後に変更された日付ではありません。

基本的に、私がやろうとしているのは、ファイルのローカルキャッシュ(実際のアプリケーションでは多数のファイルになる)を保持し、必要に応じてダウンロードすることだけです。私はWebプロキシがデフォルトでこれを行う必要があることを半分知っており、これらのファイルが保存されている基本的なWAMPサーバーを実行していますが、これをPyQtアプリケーションに適用する方法がわかりません。ダウンロードしてキャッシュする必要のあるファイルは潜在的に数十あり、そのうちの約半分はめったに変更されないため、これらのファイルをチェックして取得するための最速の方法を見つけようとしています。

おそらくこれはそれを実行するための正しい方法ではないので、これを行うための(はるかに優れた/他の多くの)方法があれば私はすべての耳です。

4

1 に答える 1

5

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))
于 2012-04-16T13:44:51.100 に答える