Получить время создания файла с Python на Mac - PullRequest
8 голосов
/ 04 июня 2009

Python os.path.getctime на Mac (и под Unix в целом) не дает дату, когда файл был создан, а "время последнего изменения" (по крайней мере, согласно документации) С другой стороны, в Finder я вижу реальное время создания файла, поэтому эту информацию хранит HFS +.

Есть ли у вас какие-либо предложения о том, как получить время создания файла на Mac в программе Python?

Ответы [ 3 ]

17 голосов
/ 04 июня 2009

Используйте свойство st_birthtime в результате вызова os.stat() (или fstat / lstat).

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 голос
/ 04 июня 2009

ctime отличается на платформе: В некоторых системах (например, Unix) - время последнего изменения метаданных, а в других (например, Windows) - время создания . Это потому, что Unices обычно не сохраняют «оригинальное» время создания.

При этом вы можете получить доступ ко всей информации, которую ОС предоставляет с помощью модуля stat .

Модуль stat определяет константы и функции для интерпретации результатов os.stat (), os.fstat () и os.lstat () (если они существуют). Для получения полной информации о вызовах stat, fstat и lstat обратитесь к документации по вашей системе.

stat.ST_CTIME
«Ctime», сообщаемое операционной системой. В некоторых системах (например, Unix) это время последнего изменения метаданных, а в других (например, Windows) - время создания (подробности см. В документации по платформе).

0 голосов
/ 18 марта 2019

Из-за отсутствия хорошей утилиты я создал 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

Обратите внимание, что для больших каталогов это будет легко в 1000 раз быстрее, чем xstat, что иногда упоминается, поскольку это создает временный файл, а затем выполняет stat вызовы для всех файлов одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...