2016-11-21 73 views
1

我試圖實現一個python腳本,它將比較本地和遠程託管文件的最後修改日期。Python - 比較兩個文件的最後修改日期,本地和遠程

如果遠程文件更新它應該: - 刪除本地文件 - 下載遠程文件與上次修改日期不變

最接近的答案我發現這是Last Modified of file downloaded does not match its HTTP header,但是我相信這下載整個文件,所以沒有節省太多的資源/時間

我想要做的只是審查遠程文件的頭,而不是下載整個文件,我相信應該更快。

這是我目前的代碼,這是非常混亂和noobish(見字符串替換等)我敢肯定有一個更好/更快的方式 - 你可以建議?

remote_source = 'http://example.com/somefile.xml' 
    local_source = 'path/to/myfile.xml' 
    if path.exists(local_source): 
     local_source_last_modified = os.path.getmtime(local_source) 
     local_source_last_modified = datetime.datetime.fromtimestamp(local_source_last_modified).strftime('(%Y, %m, %d, %H, %M, %S)') 
     conn = urllib.urlopen(remote_source) 
     remote_source_last_modified = conn.info().getdate('last-modified') 
     remote_source_last_modified = str(remote_source_last_modified) 
     remote_source_last_modified = remote_source_last_modified.replace(", 0, 1, 0)", ")") 
     if local_source_last_modified < remote_source_last_modified: 
      pass 
     else: 
      headers = urlretrieve(remote_source, local_source)[1] 
      lmStr = headers.getheader("Last-Modified") 
      remote_source_last_modified = mktime(strptime(lmStr, "%a, %d %b %Y %H:%M:%S GMT")) 
      os.utime(local_source, (remote_source_last_modified, remote_source_last_modified)) 
    else: 
     headers = urlretrieve(remote_source, local_source)[1] 
     lmStr = headers.getheader("Last-Modified") 
     remote_source_last_modified = mktime(strptime(lmStr, "%a, %d %b %Y %H:%M:%S GMT")) 
     os.utime(local_source, (remote_source_last_modified, remote_source_last_modified)) 

回答

1

以防萬一任何人讀這一點,這是我結束了:

def syncCheck(file_path): 
    remote_source = 'http://example.com/' + os.path.basename(file_path) 
    local_source = file_path 

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'} 
    response = requests.head(remote_source, headers = headers) 
    remote_source_last_modified = response.headers["last-modified"] 
    remote_source_last_modified = time.mktime(datetime.datetime.strptime(remote_source_last_modified[:-4], "%a, %d %b %Y %H:%M:%S").timetuple()) 

    try: 
     if os.path.exists(local_source): 
      local_source_last_modified = os.path.getmtime(local_source) 
      if local_source_last_modified == remote_source_last_modified: 
       break 
      else: 
       try: 
        os.remove(local_source) 
       except: 
        break 
       urlretrieve(remote_source, local_source) 
       os.utime(local_source, (remote_source_last_modified, remote_source_last_modified)) 

    else: 
     urlretrieve(remote_source, local_source) 
     os.utime(local_source, (remote_source_last_modified, remote_source_last_modified)) 

    except HTTPError, e: 
     print("HTTP Error: " + str(e.fp.read())) 
    except URLError, e: 
     print("URL Error: " + str(e.reason))