Jak uzyskać datę/czas utworzenia i modyfikacji pliku w Pythonie?

Mam skrypt, który musi zrobić kilka rzeczy w oparciu o daty utworzenia i modyfikacji plików, ale musi działać na Linuksie i Windows.

Jaki jest najlepszy cross-platform sposób na uzyskanie daty/czasu tworzenia i modyfikacji plików w Pythonie?

 713
Author: Mark Biek, 2008-10-26

10 answers

Uzyskanie pewnego rodzaju daty modyfikacji w sposób wieloplatformowy jest łatwe - wystarczy zadzwonić os.path.getmtime(path) otrzymasz uniksowy znacznik czasu, kiedy Plik path był ostatnio modyfikowany.

Z drugiej strony, Pobieranie pliku tworzenie dat jest zależne od platformy, różniące się nawet między trzema dużymi osami:

Putting this all razem kod wieloplatformowy powinien wyglądać mniej więcej tak...

import os
import platform

def creation_date(path_to_file):
    """
    Try to get the date that a file was created, falling back to when it was
    last modified if that isn't possible.
    See http://stackoverflow.com/a/39501288/1709587 for explanation.
    """
    if platform.system() == 'Windows':
        return os.path.getctime(path_to_file)
    else:
        stat = os.stat(path_to_file)
        try:
            return stat.st_birthtime
        except AttributeError:
            # We're probably on Linux. No easy way to get creation dates here,
            # so we'll settle for when its content was last modified.
            return stat.st_mtime
 350
Author: Mark Amery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-19 13:44:53

Masz kilka możliwości. Po pierwsze, możesz użyć os.path.getmtime oraz os.path.getctime Funkcje:

import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))

Inną opcją jest użycie os.stat:

import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))

Uwaga: ctime() czy Nie odnosi się do czasu tworzenia w systemach *nix, ale raczej do czasu ostatniej zmiany danych i-węzła. (dzięki kojiro za wyjaśnienie tego faktu w komentarzach, podając link do interesującego posta na blogu)

 617
Author: Bryan Oakley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-06 21:40:46

Najlepszą funkcją do tego jest os./ align = "left" / getmtime () . Wewnętrznie, to po prostu używa os.stat(filename).st_mtime.

Moduł datetime jest najlepszym manipulatorem znaczników czasu, więc możesz uzyskać datę modyfikacji jako obiekt datetime w następujący sposób:

import os
import datetime
def modification_date(filename):
    t = os.path.getmtime(filename)
    return datetime.datetime.fromtimestamp(t)

Przykład użycia:

>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)
 345
Author: Christian Oudard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-06 14:56:39

Os.stat https://docs.python.org/2/library/stat.html#module-stat

Edit: W nowszym kodzie powinieneś używać os./ align = "left" / getmtime () (dzięki Christian Oudard)
zwróć jednak uwagę, że zwraca zmiennoprzecinkową wartość time_t z ułamkiem sekund (jeśli Twój system operacyjny ją obsługuje)

 46
Author: Martin Beckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 17:23:32

Istnieją dwie metody, aby uzyskać czas mod, os./ align = "left" / getmtime () lub os.stat (), ale ctime nie jest niezawodny międzyplatformowo(patrz niżej).

Os./ align = "left" / getmtime()

Getmtime(ścieżka)
zwraca czas ostatniej modyfikacji ścieżki. Zwracaną wartością jest liczba dająca ilość sekund od epoki (patrz moduł czasu). Podnieść os.błąd, jeśli plik nie istnieje lub jest niedostępny. Nowość w wersji 1.5.2. Zmieniony w wersji 2.3: Jeśli os.stat_float_times () zwraca True, wynikiem jest Liczba zmiennoprzecinkowa.

Os.stat()

Stat(ścieżka)
wykonaj wywołanie systemowe stat () na podanej ścieżce. Zwracaną wartością jest obiekt, którego atrybuty odpowiadają elementom struktury stat, a mianowicie: st_mode (protection bitów), st_ino (numer i-węzła), st_dev (urządzenie), st_nlink (liczba twardych łączy), st_uid (identyfikator użytkownika właściciela), st_gid (identyfikator grupy właściciela), st_size (rozmiar plik w bajtach), st_atime (czas ostatniego dostępu), st_mtime (czas ostatniej zawartości modification), st_ctime (zależny od platformy; czas ostatniej zmiany metadanych w systemie Unix lub czas utworzenia w systemie Windows):

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

W powyższym przykładzie można użyć statinfo. st_mtime lub statinfo. st_ctime, aby uzyskać odpowiednio mtime i ctime.

 36
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-25 22:05:20

os.stat zwraca krotkę nazwaną z atrybutami st_mtime i st_ctime. Czas modyfikacji to st_mtime na obu platformach; niestety, w Windows ctime oznacza "czas tworzenia", podczas gdy w POSIX oznacza"czas zmiany". Nie znam żadnego sposobu na uzyskanie czasu tworzenia na platformach POSIX.

 11
Author: mithrandi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 12:55:24
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
 2
Author: unmounted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-25 22:07:44

Jeśli poniższe dowiązania symboliczne nie są ważne, Możesz również użyć wbudowanego os.lstat.

>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0
 1
Author: Low Kian Seong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 00:13:15

os.stat Zawiera czas tworzenia. Po prostu nie ma definicji st_anything dla elementu os.stat(), który zawiera czas.

Więc spróbuj tego:

os.stat('feedparser.py')[8]

Porównaj to z datą utworzenia pliku w ls-lah

Powinny być takie same.
 0
Author: Rod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 14:55:38

Udało mi się uzyskać czas tworzenia w posix, uruchamiając systemową komendę stat i analizując wyjście.

commands.getoutput('stat FILENAME').split('\"')[7]

Uruchamianie stat poza Pythonem z terminala (OS X) zwrócone:

805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt

... gdzie czwarty datetime jest tworzeniem pliku (a nie czasem zmiany ctime, jak zauważono w innych komentarzach).

 -3
Author: kmarchand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-29 20:54:51