在Mac上使用Python获取文件创建时间

时间:2009-06-03 20:16:52

标签: python macos

Mac上的Python的os.path.getctime(以及一般的Unix下)没有给出创建文件的日期,而是“最后一次更改的时间”(至少根据文档)。另一方面,在Finder中我可以看到真正的文件创建时间,因此这些信息由HFS +保存。

对于如何在Python程序中获取Mac上的文件创建时间,您有什么建议吗?

3 个答案:

答案 0 :(得分:17)

st_birthtime(或fstat / lstat)的调用结果使用os.stat()属性。

def get_creation_time(path):
    return os.stat(path).st_birthtime

您可以使用datetime.datetime.fromtimestamp()将整数结果转换为日期时间对象。

由于某些原因,我认为这个答案在第一次写入时并不适用于Mac OS X,但我可能会误解,现在它确实有用,即使使用旧版本的Python也是如此。对于子孙后代,旧答案如下。


使用ctypes访问系统调用stat64(适用于Python 2.5 +):

from ctypes import *

class struct_timespec(Structure):
    _fields_ = [('tv_sec', c_long), ('tv_nsec', c_long)]

class struct_stat64(Structure):
    _fields_ = [
        ('st_dev', c_int32),
        ('st_mode', c_uint16),
        ('st_nlink', c_uint16),
        ('st_ino', c_uint64),
        ('st_uid', c_uint32),
        ('st_gid', c_uint32), 
        ('st_rdev', c_int32),
        ('st_atimespec', struct_timespec),
        ('st_mtimespec', struct_timespec),
        ('st_ctimespec', struct_timespec),
        ('st_birthtimespec', struct_timespec),
        ('dont_care', c_uint64 * 8)
    ]

libc = CDLL('libc.dylib') # or /usr/lib/libc.dylib
stat64 = libc.stat64
stat64.argtypes = [c_char_p, POINTER(struct_stat64)]

def get_creation_time(path):
    buf = struct_stat64()
    rv = stat64(path, pointer(buf))
    if rv != 0:
        raise OSError("Couldn't stat file %r" % path)
    return buf.st_birthtimespec.tv_sec

使用subprocess来调用stat实用程序:

import subprocess

def get_creation_time(path):
    p = subprocess.Popen(['stat', '-f%B', path],
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if p.wait():
        raise OSError(p.stderr.read().rstrip())
    else:
        return int(p.stdout.read())

答案 1 :(得分:1)

ctime在平台上有所不同:在某些系统(如Unix)上是最后一次元数据更改的时间,而在其他系统(如Windows)上则是创建时间。那是因为Unices通常不会保留“原创”创作时间。

也就是说,您可以使用stat模块访问操作系统提供的所有信息。

  

stat模块定义用于解释os.stat(),os.fstat()和os.lstat()(如果存在)结果的常量和函数。有关stat,fstat和lstat调用的完整详细信息,请参阅系统文档。

     

stat.ST_CTIME
  操作系统报告的“ctime”。在某些系统(如Unix)上是最后一次元数据更改的时间,而在其他系统(如Windows)上则是创建时间(有关详细信息,请参阅平台文档)。

答案 2 :(得分:0)

由于缺乏好的实用程序,我创建了crtime

pip install crtime

然后您可以像使用它一样

sudo crtime ./

会打印:

1552938281  /home/pascal/crtime/.gitignore
1552938281  /home/pascal/crtime/README.md
1552938281  /home/pascal/crtime/crtime
1552938281  /home/pascal/crtime/deploy.py
1552938281  /home/pascal/crtime/setup.cfg
1552938281  /home/pascal/crtime/setup.py
1552938961  /home/pascal/crtime/crtime.egg-info
1552939447  /home/pascal/crtime/.git
1552939540  /home/pascal/crtime/build
1552939540  /home/pascal/crtime/dist

请注意,对于大型目录,它有时会比有时提到的xstat快1000倍,因为这会创建一个临时文件,然后立即对所有文件执行stat调用。