2009-06-03 3 views
8

Python na os.path.getctime na komputerze Mac (a także w systemie Unix) nie podaje daty utworzenia pliku, lecz "czas ostatniej zmiany" (zgodnie z przynajmniej docs). Z drugiej strony w Finderze widzę prawdziwy czas tworzenia pliku, więc informacja ta jest przechowywana przez HFS +.Uzyskaj czas utworzenia pliku w Pythonie na komputerze Mac

Czy masz jakieś sugestie, w jaki sposób uzyskać czas utworzenia pliku na komputerze Mac w programie Python?

+0

Duplikat: http://stackoverflow.com/questions/237079/how-to-get-file-creation-modification-date-times-in-python –

+1

@ S.Lott : niezupełnie, ponieważ uzyskanie czasu utworzenia pliku na komputerze Mac jest z natury nieinterfejsalne. – Miles

+0

@Miles: być może prawda, ale odpowiedź na to pytanie idealnie pasuje do tego pytania. –

Odpowiedz

14

Użyj właściwości st_birthtime w wyniku wezwania do os.stat() (lub fstat/lstat).

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

można przekonwertować wynik całkowitej do obiektu datetime przy użyciu datetime.datetime.fromtimestamp().

Z jakiegoś powodu nie wydaje mi się, żeby działało na systemie Mac OS X, kiedy ta odpowiedź została napisana po raz pierwszy, ale mógłbym się mylić i działa już teraz, nawet w starszych wersjach Pythona. Stara odpowiedź jest poniżej dla potomności.


Korzystanie ctypes aby uzyskać dostęp do funkcji systemowej stat64 (działa z 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 

Korzystanie subprocess zadzwonić narzędzia 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

Idealny! Właśnie tego szukałem. – cefstat

+1

Na El Capitan, możesz użyć 'libc = CDLL ('/ usr/lib/libc.dylib')' zamiast 'libc = CDLL ('libc.dylib')' jeśli otrzymasz 'OSError: dlopen (libc.dylib, 6): nie znaleziono obrazu ". –

+0

@ThomasOrozco Mimo wszystko jest lepsze podejście niż ctypes. – Miles

1

ctime różni się na platformie: W niektórych systemach (takich jak Unix) jest to czas ostatniej zmiany metadanych, a na innych (takich jak Windows) jest czas utworzenia. To dlatego, że Unices zazwyczaj nie zachowują "oryginalnego" czasu tworzenia.

Powiedziawszy, że możesz uzyskać dostęp do wszystkich informacji, które system operacyjny zapewnia z modułem 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

Dzięki, ale ... stat.ST_CTIME: "ctime" zgłoszone przez system operacyjny. W niektórych systemach (takich jak Unix) jest to czas ostatniej zmiany metadanych, a na innych (takich jak Windows) jest czas utworzenia (szczegóły w dokumentacji platformy). – cefstat

+1

@cefstat Właśnie o to chodzi. Niektóre systemy (np. Unice) po prostu nie _wprowadzają "oryginalnego" czasu tworzenia. Nic nie może zrobić z tym pyton. – lothar