python转换在os.utime中使用的datetime

hav*_*age 11 python datetime

我无法在python中的文件上设置ctime/mtime.首先,我通过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
Run Code Online (Sandbox Code Playgroud)

然后我下载文件

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
Run Code Online (Sandbox Code Playgroud)

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

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

    #        return False
Run Code Online (Sandbox Code Playgroud)

这就是我试图这样做的方式

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)
Run Code Online (Sandbox Code Playgroud)

错误是:

    os.utime(fileName, orgTime)
TypeError: utime() arg 2 must be a tuple (atime, mtime)
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我或者给我一个更好的方法来保持原始文件的时间戳或如何将ftime转换为os.utime的可用元组

Mar*_*ers 9

os.utime()文档:

否则,时间必须是2元组的数字,(atime, mtime)分别用于设置访问和修改时间的形式.

你没有给它一个元组.在这种情况下,只需设置atimemtime相同的值:

os.utime(fileName, (orgTime, orgTime))
Run Code Online (Sandbox Code Playgroud)

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

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

settime = time.mktime(ftime.timetuple())
Run Code Online (Sandbox Code Playgroud)

  • 小心使用`time.mktime`它是依赖于语言环境的,请参阅http://stackoverflow.com/a/7852891/424939更好地使用`datetime.datetime.utcfromtimestamp(0)`参见同一个问题 (2认同)