Время изменения файла, возвращающееся после изменения с помощью os.utime в python

Я столкнулся с проблемой в python 2.7.1 (работает на Mac OS X 10.7.5) с командой os.utime

Я пытаюсь разработать сценарий, который загружает файлы с 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)

1 ответ

Решение

Вы пропускаете скобки в lf.close; так должно быть lf.close(),

Без скобок вы фактически не закрываете файл. Вместо этого файл закрывается немного позже сборщиком мусора после вашего вызова os.utime, Поскольку закрытие файла сбрасывает оставшееся содержимое буфера ввода-вывода, время модификации будет обновлено как побочный эффект, что приведет к засорению ранее установленного значения.

Другие вопросы по тегам