我正在尝试创建一种方法,只有当文件最新版本已下载到我的计算机时,才允许我从服务器下载文件(使用HTTP)。
我找到了一种方法来获取上次在服务器上修改文件的时间(至少是服务器最后一次认为它已被修改):
u = urllib2.urlopen(url)
meta = u.info()
print("Last Modified: " + str(meta.getheaders("Last-Modified")))
现在的问题是如何使用此信息与我计算机上已有的文件进行比较,看看服务器上的版本是否比我计算机上保存的版本更新。
我尝试使用python-wget
库;但是,它没有帮助。它正在下载所有内容,甚至没有覆盖文件(它正在创建新文件),所以我意识到该库不会检查时间戳。
解决这个问题的最佳方法是什么?
答案 0 :(得分:2)
考虑os.path.getmtime获取计算机文件的修改日期。
但是您需要将url标头的修改时间转换为时间戳,以便在计算机和服务器文件之间进行比较:
import os, datetime, time
u = urllib2.urlopen(url)
meta = u.info()
print("Last Modified: " + str(meta.getheaders("Last-Modified")))
# CONVERTING HEADER TIME TO UTC TIMESTAMP
# ASSUMING 'Sun, 28 Jun 2015 06:30:17 GMT' FORMAT
meta_modifiedtime = time.mktime(datetime.datetime.strptime( \
meta.getheaders("Last-Modified"), "%a, %d %b %Y %X GMT").timetuple())
file = 'C:\Path\ToFile\somefile.xml'
if os.path.getmtime(file) > meta_modifiedtime:
print("CPU file is older than server file.")
else:
print("CPU file is NOT older than server file.")
答案 1 :(得分:0)
根据last-modified
比较文件不是最好的方法,但是因为你问过......
from __future__ import print_function
import requests
import os.path
import time
import shutil
url = 'https://www.google.com/images/srpr/logo11w.png'
file = 'logo11w.png'
r = requests.get(url)
meta = r.headers['last-modified']
print("Web Last Modified: {0}".format(meta))
filetime = (time.strftime('%a, %d %b %Y %X GMT', time.gmtime(os.path.getmtime(file))))
print("File Last Modified: {0}".format(filetime))
if filetime > meta:
print("Newer file found! Downloading...")
f = requests.get(url, stream=True)
with open ('logo11w.png', 'wb') as out_file:
shutil.copyfileobj(response.raw,out_file)
del response
else:
print('No new version found. You got the latest file!')
答案 2 :(得分:0)
我还没有足够的声誉来为答案添加评论,所以我只是添加了自己的答案。
我正在使用Python 2.7并且必须修改@parfait给出的答案才能使其工作。
1)我必须将您从meta.getheaders("Last-Modified")
获得的列表转换为字符串。
2)当您将时间转换为秒时,更高的秒数将是更新的日期,因为更多秒意味着自某个日期以来已经过了更多的时间。所以我也在 if 语句中将>
更改为<
。
结果如下:
import os, datetime, time
u = urllib2.urlopen(url)
meta = u.info()
print("Last Modified: " + str(meta.getheaders("Last-Modified")))
# CONVERTING HEADER TIME TO UTC TIMESTAMP
# ASSUMING 'Sun, 28 Jun 2015 06:30:17 GMT' FORMAT
# Remember datetime.datetime.strptime() takes a string as the first param...
meta_modifiedtime = time.mktime(datetime.datetime.strptime( \
''.join(meta.getheaders("Last-Modified")), "%a, %d %b %Y %X GMT").timetuple())
file = 'C:\Path\ToFile\somefile.xml'
if os.path.getmtime(file) < meta_modifiedtime: #change > to <
print("CPU file is older than server file.")
else:
print("CPU file is NOT older than server file.")