Как получить дату/время создания и изменения файла в Python?
У меня есть скрипт, который должен делать некоторые вещи на основе дат создания и изменения файлов, но должен работать на Linux и Windows.
Что самое лучшее кросс-платформенный способ получить дату/время создания и изменения файла в Python?
10 ответов
получить какую-то дату модификации кросс - платформенным способом легко-просто позвоните os.path.getmtime(path)
и вы получите метку времени Unix, когда файл в path
последнего изменения.
получения файла создание даты, с другой стороны, fiddly и зависящие от платформы, отличающиеся даже между тремя большими осами:
- On окна, файла
ctime
(описана в https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx) хранит дату создания. Вы можете получить доступ к этому в Python посредствомos.path.getctime()
или.st_ctime
атрибут результата вызоваos.stat()
. Это не работа на Unix, гдеctime
это последний раз, когда атрибуты файла или содержание были изменены. - On Mac, а также некоторые другие ОС на основе Unix, вы можете использовать
.st_birthtime
атрибут результата вызоваos.stat()
. -
On Linux, в настоящее время это невозможно, по крайней мере, без написания расширения C для Python. Хотя некоторые файловые системы обычно используются с Linux хранить даты создания (например,
ext4
сохраняет их вst_crtime
), ядро Linux не предлагает никакого способа доступа к ним; в частности, структуры, которые он возвращает отstat()
вызовы на языке C, начиная с последней версии ядра,не содержат полей даты создания. Вы также можете увидеть, что идентификаторst_crtime
в настоящее время не имеет нигде в исходным кодом на Python. По крайней мере, если вы наext4
, данных и прикреплен к кодам в файловой системе, но нет удобного способа доступа к нему.следующая лучшая вещь в Linux-это доступ к файлу
mtime
, либо черезos.path.getmtime()
или.st_mtime
наos.stat()
результат. Это даст вам последний раз, когда содержимое файла было изменено, что может быть достаточным для некоторых случаев использования.
собирая все это вместе, кросс-платформенный код должен выглядеть примерно так...
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
у вас есть несколько вариантов. Во-первых, вы можете использовать os.path.getmtime
и os.path.getctime
функции:
import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
другой вариант-использовать 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))
Примечание: ctime()
тут не см. время создания в системах * nix, но скорее последний раз, когда данные индекса изменились. (спасибо Кодзиро за то, что он прояснил этот факт в комментариях, предоставив ссылку на интересный блог post)
лучшая функция для этого -os.путь.getmtime(). Внутренне, это просто использует os.stat(filename).st_mtime
.
модуль datetime является лучшим манипулированием метками времени, поэтому вы можете получить дату изменения как datetime
объект вроде этого:
import os
import datetime
def modification_date(filename):
t = os.path.getmtime(filename)
return datetime.datetime.fromtimestamp(t)
пример использования:
>>> 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)
os.stat https://docs.python.org/2/library/stat.html#module-stat
edit: в новом коде вы, вероятно, должны использовать os.путь.getmtime() (спасибо христианской Oudard)
но обратите внимание, что он возвращает значение с плавающей запятой time_t с долей секунды (если ваша ОС поддерживает его)
существует два метода для получения времени mod, os.путь.getmtime() или OS.stat (), но ctime не является надежным кросс-платформенным (см. ниже).
os.путь.getmtime()
getmtime(путь)
возвращает время последней модификации путь. Возвращаемое значение-это число, дающее
количество секунд с начала эпохи (см. модуль). Поднять ОС.ошибки если файл не
не существует или недоступна. Новое в версия 1.5.2. Изменено в версии 2.3: если
ОС.stat_float_times () возвращает True, результатом является число с плавающей запятой.
os.stat ()
stat(путь)
выполните системный вызов stat () по заданному пути. Возвращаемое значение-это объект,
атрибуты соответствуют элементам структуры stat, а именно: st_mode (защита
бит), st_ino (номер inode), st_dev (устройства), st_nlink (количество ссылки), st_uid
(идентификатор пользователя владельца), st_gid (идентификатор группы владельца), st_size (размер файла, в байтах),
st_atime (время последнего доступа), тип доступа (время последнего контента
модификация),st_ctime (зависит от платформы; время последнего изменения метаданных в Unix или время создания в Windows):
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>>
в приведенном выше примере вы будете использовать statinfo.st_mtime или statinfo.st_ctime для получения mtime и ctime соответственно.
os.stat
возвращает именованный кортеж с st_mtime
и st_ctime
атрибуты. Время модификации st_mtime
на обеих платформах; к сожалению, на Windows, ctime
означает "время создания", тогда как в POSIX это означает"время изменения". Я не знаю, как получить время создания на платформах POSIX.
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>>
Если следующие символические ссылки не важны, вы также можете использовать os.lstat
builtin.
>>> 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
os.stat
включает время создания. Просто нет определения st_anything для элемента os.stat()
, которая содержит время.
Так что попробуйте это:
os.stat('feedparser.py')[8]
сравните это с датой создания файла в ls-lah
Они должны быть одинаковыми.
я смог получить время создания на posix, запустив команду stat системы и проанализировав вывод.
commands.getoutput('stat FILENAME').split('\"')[7]
запуск stat вне python из терминала (OS X) возвращается:
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
... где четвертое datetime-это создание файла (а не время изменения ctime, как отмечалось в других комментариях).