Как получить дату/время создания и изменения файла в Python?

У меня есть скрипт, который должен делать некоторые вещи на основе дат создания и изменения файлов, но должен работать на Linux и Windows.

Что самое лучшее кросс-платформенный способ получить дату/время создания и изменения файла в Python?

10 ответов


получить какую-то дату модификации кросс - платформенным способом легко-просто позвоните os.path.getmtime(path) и вы получите метку времени Unix, когда файл в path последнего изменения.

получения файла создание даты, с другой стороны, fiddly и зависящие от платформы, отличающиеся даже между тремя большими осами:

собирая все это вместе, кросс-платформенный код должен выглядеть примерно так...

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, как отмечалось в других комментариях).