2009-06-03 5 views
8

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

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

+0

Дублированный: HTTP://stackoverflow.com/questions/237079/how-to-get-file-creation-modification-date-times-in-python –

+1

@ S.Lott : на самом деле, поскольку получение времени создания файла на Mac по своей сути не является межплатформенным. – Miles

+0

@Miles: возможно, правда, но ответ на этот вопрос отлично подходит для этого вопроса. –

ответ

14

Используйте 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()) 
+0

Отлично! Это именно то, что я искал. – cefstat

+1

На El Capitan вы можете использовать 'libc = CDLL ('/ usr/lib/libc.dylib')' вместо 'libc = CDLL ('libc.dylib')', если вы получаете 'OSError: dlopen (libc.dylib, 6): изображение не найдено'. –

+0

@ThomasOrozco. В любом случае, есть лучший подход, чем ctypes. – Miles

1

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

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

The stat module defines constants and functions for interpreting the results of os.stat(), os.fstat() and os.lstat() (if they exist). For complete details about the stat, fstat and lstat calls, consult the documentation for your system.

stat.ST_CTIME
The “ctime” as reported by the operating system. On some systems (like Unix) is the time of the last metadata change, and, on others (like Windows), is the creation time (see platform documentation for details).

+0

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

+1

@cefstat Вот в чем смысл. Некоторые системы (например, unices) просто не выполняют _not_ предоставления «оригинального» времени создания. Ничего не может сделать python. – lothar

Смежные вопросы