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?
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.
- na Windows , plik
ctime
(udokumentowany w https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) przechowuje swoje Data utworzenia. Możesz uzyskać dostęp do tego w Pythonie poprzezos.path.getctime()
lub.st_ctime
atrybut wyniku wywołania doos.stat()
. To nie będzie działać na Unixie, gdziectime
ostatni raz atrybuty pliku lub zostały zmienione . - na Mac , jak również na niektórych innych systemach operacyjnych opartych na Uniksie, możesz użyć
.st_birthtime
atrybut wyniku wywołania doos.stat()
. -
On Linux , to jest obecnie niemożliwe, przynajmniej bez napisania rozszerzenia C dla Pythona. Chociaż niektóre systemy plików często używane z Linuksem przechowują daty utworzenia (na przykład
ext4
przechowuje je wst_crtime
), jądro Linuksa nie oferuje dostępu do nich; w szczególności struktury , które zwraca zstat()
W C, od najnowszej wersji jądra nie zawierają żadnych pól daty utworzenia. Można również zobaczyć, że identyfikatorst_crtime
nie występuje obecnie nigdzie w źródło Pythona . Przynajmniej jeśli korzystasz zext4
, Dane są dołączone do i-węzłów w systemie plików, ale nie ma wygodnego sposobu na uzyskanie do nich dostępu.Następną najlepszą rzeczą w Linuksie jest dostęp do pliku
mtime
, poprzez alboos.path.getmtime()
lub.st_mtime
atrybut wynikuos.stat()
. Spowoduje to, że zawartość pliku została ostatnio zmodyfikowana, co może być odpowiednie dla niektórych przypadków użycia.
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
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)
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)
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)
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.
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.
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
>>>
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
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.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).
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