根据Python

时间:2015-06-28 22:55:57

标签: python python-2.7 python-3.x

我正在尝试创建一种方法,只有当文件最新版本已下载到我的计算机时,才允许我从服务器下载文件(使用HTTP)。

我找到了一种方法来获取上次在服务器上修改文件的时间(至少是服务器最后一次认为它已被修改):

u = urllib2.urlopen(url)
meta = u.info()
print("Last Modified: " + str(meta.getheaders("Last-Modified")))

现在的问题是如何使用此信息与我计算机上已有的文件进行比较,看看服务器上的版本是否比我计算机上保存的版本更新。

我尝试使用python-wget库;但是,它没有帮助。它正在下载所有内容,甚至没有覆盖文件(它正在创建新文件),所以我意识到该库不会检查时间戳。

解决这个问题的最佳方法是什么?

3 个答案:

答案 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.")