Python que convierte datetime para ser utilizado en os.utime

No puedo establecer ctime / mtime en mi archivo dentro de python. Primero obtengo la marca de tiempo original del archivo a través de ftp

Lo único que quiero es mantener las marcas de tiempo originales en mis archivos descargados usando el ftplib.

def getFileTime(ftp,name): try : modifiedTime = ftp.sendcmd('MDTM ' + name) filtid = datetime.strptime(modifiedTime[4:], "%Y%m%d%H%M%S").strftime("%d %B %Y %H:%M:%S") return filtid except : return False 

Luego descargo el archivo

 def downloadFile(ftp, fileName) : try: ftp.retrbinary('RETR %s' % fileName,open(fileName, 'wb').write) except ftplib.error_perm: print 'ERROR: cannot read file "%s"' % fileName os.unlink(fileName) return False else: print '*** Downloaded "%s" to CWD' % fileName return True 

y quiero configurar la marca de tiempo original para el archivo descargado

 def modifyTimestapToOriginal(fileName, orgTime): #try: os.utime(fileName, orgTime) fileName.close() # return True # except: # return False 

Así es como estoy intentando hacerlo.

 ftp, files = f.loginftp(HOST,user,passwd,remoteDir) for i in files : if not f.isDir(ftp,i) : fixTime = datetime.strptime(varfixtime, "%d-%m-%Y %H:%M:%S") ftime = f.getFileTime(ftp,i) if ftime >= fixTime : print (ftime) os.chdir('c:/testdownload') f.downloadFile(ftp,i) settime = ftime.timetuple() print "settime '%s'" % settime #f.modifyTimestapToOriginal(i, settime) 

El error es:

  os.utime(fileName, orgTime) TypeError: utime() arg 2 must be a tuple (atime, mtime) 

¿Puede alguien ayudarme a darme una mejor manera de conservar las marcas de tiempo del archivo original o cómo convertir el tiempo en una tupla utilizable para os.utime?

De la documentación de os.utime() :

De lo contrario, los tiempos deben ser una doble tupla de números, de la forma (atime, mtime) que se utiliza para establecer el acceso y los tiempos modificados, respectivamente.

No le estás dando una tupla. En este caso, simplemente configure atime y mtime al mismo valor :

 os.utime(fileName, (orgTime, orgTime)) 

fileName es una cadena, por lo que fileName.close() no funcionará (obtendrá un error de atributo), simplemente suelte esa línea.

orgTime debe ser un entero; le estás dando una tupla de tiempo; convertirlo en una marca de tiempo en segundos desde la época con time.mktime() :

 settime = time.mktime(ftime.timetuple())