2013-06-22 90 views
1

與os.utime變更後恢復我經歷了一個問題,在Python 2.7.1與os.utime命令文件修改時間在Python

我來了(運行在Mac OS X 10.7.5)試圖開發一個腳本從FTP下載符合特定條件的文件,但如果該文件存在,並且我已經在本地目錄上擁有它的副本,那麼我想檢查文件修改時間。如果他們不匹配,那麼我下載新的副本。爲了實現這個目標,我得到了FTP文件修改時間,將其轉換爲時間戳,然後使用os.utime更改下載的文件的訪問和修改日期以匹配FTP服務器。 我的問題是,一旦我從子程序中退出,在那裏我改變訪問和修改時間,他們恢復到原來的!我沒有任何東西在後臺運行,我也在linux服務器上測試了腳本,結果相同

如果您運行代碼兩次,它會在調試註釋中顯示問題,因爲FTP服務器中的文件沒有改變,但時間戳與當地的正確改變不匹配。 在此先感謝您對此問題的任何幫助。

import ftplib 
import os 
from datetime import datetime 

def DownloadAndSetTimestamp(local_file,fi,nt): 
    lf=open(local_file,'wb') 
    f.retrbinary("RETR " + fi, lf.write, 8*1024) 
    lf.close 
    print fi + " downloaded!" 

    print "-> mtime before change : " + str(os.stat(local_file).st_mtime) 
    print "-> atime before change : " + str(os.stat(local_file).st_atime) 
    print "-> FTP value  : " + str(int(nt)) 
    #set the modification time the same as server for future comparison 
    os.utime(local_file,(int(nt) , int(nt))) 
    print "-> mtime after change : "+ str(os.stat(local_file).st_mtime) 
    print "-> atime after change : "+ str(os.stat(local_file).st_atime) 

print "Connecting to ftp.ncbi.nih.gov..." 
f=ftplib.FTP('ftp.ncbi.nih.gov') 
f.login() 
f.cwd('/genomes/Bacteria/') 
listing=[] 
dirs=f.nlst(); 
print "Connected and Dir list retrieved." 

target_bug="Streptococcus_pseudopneumoniae" 
print "Searching for :"+ target_bug 
ct=0; 
Target_dir="test/" 
for item in dirs: 
    if item.find(target_bug)>-1: 
     print item 
     #create the dir 
     if not os.path.isdir(os.path.join(Target_dir,item)): 
      print "Dir not found. Creating it..." 
      os.makedirs(os.path.join(Target_dir,item)) 
     #Get the gbk 
     #1) change the dir 
     f.cwd(item) 
     #2) get *.gbk files in dir 
     files=f.nlst('*.gbk') 
     for fi in files: 
      print "----------------------------------------------" 
      local_file = os.path.join(Target_dir,item,fi) 
      if os.path.isfile(local_file): 
       print "################" 
       print "File " + local_file + " already exists." 
       #get remote modification time   
       mt = f.sendcmd('MDTM '+ fi) 
       #converting to timestamp 
       nt = datetime.strptime(mt[4:], "%Y%m%d%H%M%S").strftime("%s") 
       #print "mtime FTP :" + str(int(mt[4:])) 
       #print "FTP M timestamp : " + str(nt) 
       #print "Local M timestamp : " + str(os.stat(local_file).st_mtime) 
       #print "Local A timestamp : " + str(os.stat(local_file).st_atime) 

       if int(nt)==int(os.stat(local_file).st_mtime): 
        print fi +" not modified. Download skipped" 
       else: 
        print "New version of "+fi 
        ct+=1 
        DownloadAndSetTimestamp(local_file,fi,nt) 
        print "NV Local M timestamp : " + str(os.stat(local_file).st_mtime) 
        print "NV Local A timestamp : " + str(os.stat(local_file).st_atime) 
       print "################" 

      else: 
       print "################" 
       print "New file: "+fi 
       ct+=1 
       mt = f.sendcmd('MDTM '+ fi) 
       #converting to timestamp 
       nt = datetime.strptime(mt[4:], "%Y%m%d%H%M%S").strftime("%s") 
       DownloadAndSetTimestamp(local_file,fi,nt) 
       print "################" 

     f.cwd('..') 
f.quit() 
print "# of "+target_bug+" new files found and downloaded: " + str(ct) 

回答

3

您錯過了lf.close中的括號;它應該是lf.close()

沒有括號,你實際上沒有關閉文件。相反,在您致電os.utime後,該文件稍後由垃圾收集器關閉。由於關閉文件會刷新未完成的IO緩衝區內容,因此修改時間將作爲副作用進行更新,從而破壞您之前設置的值。

+0

謝謝!這確實是個問題。我對Python非常陌生,並且這些沒有提出任何消息/警告的情況仍然讓我感到困惑!我期望不關閉括號會導致異常。 – JAC

+0

@JAC它不會引發異常,因爲'lf.close'是一個有效的表達式 - 它計算到綁定到特定實例''lf'的'close'方法。例如,你可以說,'fn = lf.close',然後發送'fn'到代碼中,它會調用它作爲'fn()',併產生和你調用'lf.close()一樣的效果' 。谷歌「綁定方法」瞭解更多細節。在你的情況下,'lf.close'在它自己的行上並不是很有用,但'2 + 2'都不是,它也不會導致異常。 – user4815162342