2012-04-16 9 views
1

Webサーバー上の同じファイルに対してローカルファイルをチェックするPythonコードがあります。そこにない場合はダウンロードし、ダウンロードした場合は、サーバー上の同じファイルのHTTPヘッダーに対して、最後に変更したファイル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文のリターンは、(あなたが二回のコードを実行した場合)1334527395.26 1333350817.0です。

私には、それらの2つは同じであるはずですが、それらは大きく違っています。ローカルでダウンロードされたファイルの修正日は、実際にはサーバー上の最終更新日ではなく、ローカルマシンにダウンロードされた日付です。

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

これは正しい方法ではないかもしれないので、これを行う方法がはるかに優れている場合は、私はすべて耳にします。

+0

ファイルの速度が実際には問題ではないため、何かが十分速くなります。あなたが変更を確実にしたければ、あなたはその内容をハッシュすることもできます。 – katrielalex

答えて

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

ありがとう、それはトリックを行います。ヘッダー情報のURLを取得していたのは、実際にはすべてをダウンロードしていたので、何も得ていないことにも注意してください。しかし、[この回答](http://stackoverflow.com/questions/107405/how-do-you-send-a-head-http-request-in-python/2070916#2070916)を見て、私はファイル全体をダウンロードせずに適切な情報を取得します。 – Cryptite

関連する問題