Python将datetime转换为可用于os.utime的格式

12

我无法在Python中设置文件的创建时间/修改时间。首先,我通过FTP获取文件的原始时间戳。

我想要的是,仅仅使用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

然后我下载该文件

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

             

我想把原始时间戳设置为已下载文件的时间戳

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

    

这是我尝试做到它的方式

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)

                 
    

错误信息为:

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

有人可以帮我找到更好的方法来保留原始文件时间戳或将ftime转换为可用的元组用于os.utime吗?

1个回答

11

根据os.utime()文档

否则,times必须是一个由两个数字组成的二元组,形式为(atime, mtime),分别用于设置访问时间和修改时间。

您没有提供一个元组。在这种情况下,只需将atimemtime都设置为相同的值即可:

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

fileName 是一个字符串,因此 fileName.close() 不起作用(你会得到一个属性错误),只需删除该行。

orgTime 必须是一个整数; 你正在给它一个时间元组; 使用 time.mktime() 将其转换为自纪元以来的秒数的时间戳:

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

5
小心使用time.mktime,因为它与本地化相关,请参见https://dev59.com/kmsz5IYBdhLWcg3wg4Cv#7852891。最好使用`datetime.datetime.utcfromtimestamp(0)`,请参见同一问题。 - Joram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接