1

os.utime コマンドを使用して、python 2.7.1 (Mac OS X 10.7.5 で実行) で問題が発生しました。

特定の基準に一致する FTP からファイルをダウンロードするスクリプトを開発しようとしていますが、ファイルが存在し、ローカル ディレクトリに既にそのコピーがある場合は、ファイルの変更時間を確認したいと考えています。それらが一致しない場合は、新しいコピーをダウンロードします。この目標を達成するために、FTP ファイルの変更時刻を取得し、それをタイムスタンプに変換してから、os.utime を使用して、ダウンロードしたファイルのアクセス日付と変更日付を FTP サーバーのものと一致するように変更します。私の問題は、アクセス時間と変更時間を変更したサブルーチンから出るとすぐに、元の時間に戻ってしまうことです! バックグラウンドで何も実行していません。また、Linuxサーバーでスクリプトをテストしても同じ結果が得られました

次のコードを 2 回実行すると、デバッグ コメントに問題が表示されます。これは、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)
4

1 に答える 1