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

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

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

Ответ 1

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

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

  • В Windows хранится дата создания файла ctime (задокументированная на https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx). Вы можете получить доступ к этому в Python через os.path.getctime() или атрибут .st_ctime результата вызова os.stat(). Это не будет работать в Unix, где ctime - это последний раз, когда атрибуты файла или контент были изменены.
  • На Mac, а также на некоторых других ОС, основанных на Unix, вы можете использовать атрибут .st_birthtime результата вызова os.stat().
  • В Linux это невозможно, по крайней мере, без написания расширения C для Python. Хотя некоторые файловые системы, обычно используемые с Linux , st_crtime даты создания хранилища (например, ext4 хранит их в st_crtime), ядро Linux не имеет доступа к ним; в частности, структуры, которые он возвращает из вызовов stat() в C, начиная с последней версии ядра, не содержат полей даты создания. Вы также можете видеть, что идентификатор st_crtime настоящее время не присутствует нигде в источнике Python. По крайней мере, если вы находитесь на ext4, данные прикрепляются к inodes в файловой системе, но нет удобного способа доступа к нему.

    Следующая лучшая вещь на 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

Ответ 2

У вас есть несколько вариантов. Во-первых, вы можете использовать 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, а скорее в последний раз, когда изменились данные inode. (спасибо kojiro за то, что этот факт более ясен в комментариях, предоставив ссылку на интересный пост в блоге)

Ответ 3

Лучшая функция для этого - os.path.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)

Ответ 4

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

edit: в новом коде вы, вероятно, должны использовать os.path.getmtime() (спасибо Кристиан Оудард)
 но обратите внимание, что он возвращает значение с плавающей запятой time_t с долей секунд (если ваша ОС поддерживает его)

Ответ 5

Есть два способа получить время mod, os.path.getmtime() или os.stat(), но ctime не является надежной кросс-платформенной (см. ниже).

os.path.getmtime()

getmtime (путь)
Верните время последней модификации пути. Возвращаемое значение - это число, дающее количество секунд с эпохи (см. модуль времени). Поднять os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если os.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_mtime (время последнего содержимого модификация), 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 соответственно.

Ответ 6

os.stat возвращает именованный кортеж с атрибутами st_mtime и st_ctime. Время модификации st_mtime на обеих платформах; к сожалению, в Windows ctime означает "время создания", тогда как на POSIX это означает "время изменения". Я не знаю, как получить время создания на платформах POSIX.

Ответ 7

В Python 3.4 и выше вы можете использовать интерфейс объектно-ориентированного интерфейса pathlib, который включает в себя обертки для большей части модуля os. Вот пример получения статистики файла.

>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}'  # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

Для получения дополнительной информации о том, что содержится os.stat_result, обратитесь к документации. Для времени модификации вы хотите fname.stat().st_mtime:

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

Если вы хотите, чтобы время создания в Windows или самые последние изменения метаданных в Unix, вы должны использовать fname.stat().st_ctime:

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

Эта статья содержит более полезную информацию и примеры для модуля pathlib.

Ответ 8

>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 

Ответ 9

import os, time, datetime

file = "somefile.txt"
print(file)

print("Modified")
print(os.stat(file)[-2])
print(os.stat(file).st_mtime)
print(os.path.getmtime(file))

print()

print("Created")
print(os.stat(file)[-1])
print(os.stat(file).st_ctime)
print(os.path.getctime(file))

print()

modified = os.path.getmtime(file)
print("Date modified: "+time.ctime(modified))
print("Date modified:",datetime.datetime.fromtimestamp(modified))
year,month,day,hour,minute,second=time.localtime(modified)[:-3]
print("Date modified: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

print()

created = os.path.getctime(file)
print("Date created: "+time.ctime(created))
print("Date created:",datetime.datetime.fromtimestamp(created))
year,month,day,hour,minute,second=time.localtime(created)[:-3]
print("Date created: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

печать

somefile.txt
Modified
1429613446
1429613446.0
1429613446.0

Created
1517491049
1517491049.28306
1517491049.28306

Date modified: Tue Apr 21 11:50:46 2015
Date modified: 2015-04-21 11:50:46
Date modified: 21/04/2015 11:50:46

Date created: Thu Feb  1 13:17:29 2018
Date created: 2018-02-01 13:17:29.283060
Date created: 01/02/2018 13:17:29

Ответ 10

Если следующие символические ссылки не важны, вы также можете использовать встроенный 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

Ответ 11

os.stat включает время создания. Просто нет определения st_anything для элемента os.stat(), содержащего время.

Итак, попробуйте следующее:

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

Сравните это с вашей датой создания файла в файле ls -lah

Они должны быть одинаковыми.

Ответ 12

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

from crtime import get_crtimes_in_dir

for fname, date in get_crtimes_in_dir(".", raise_on_error=True, as_epoch=False):
    print(fname, date)
    # file_a.py Mon Mar 18 20:51:18 CET 2019

Ответ 13

Мне удалось получить время создания в posix, запустив команду stat stat и разобрав вывод.

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

Запустил стат вне 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 - это создание файла (а не время смены времени, как отмечалось в других комментариях).