Как узнать дату и время создания и изменения файла в Python? - PullRequest
800 голосов
/ 26 октября 2008

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

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

Ответы [ 13 ]

637 голосов
/ 26 октября 2008

У вас есть несколько вариантов. Например, вы можете использовать функции 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. (спасибо Кодзиро за разъяснение этого факта в комментариях, предоставив ссылку на интересную запись в блоге)

457 голосов
/ 15 сентября 2016

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

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

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

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
358 голосов
/ 06 октября 2009

Лучшая функция для этого - 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)
46 голосов
/ 26 октября 2008

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

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

37 голосов
/ 26 октября 2008

Существует два метода получения времени мода: os.path.getmtime () или os.stat (), но ctime не является надежным кроссплатформенным (см. Ниже).

os.path.getmtime ()

getmtime ( path )
Возвращает время последней модификации пути. Возвращаемое значение представляет собой число, дающее количество секунд с начала эпохи (см. модуль времени). Поднимите os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: если os.stat_float_times () возвращает True, результатом является число с плавающей запятой.

os.stat ()

stat ( path )
Выполнить системный вызов stat () по заданному пути. Возвращаемое значение является объектом, чей атрибуты соответствуют членам структуры статистики, а именно: st_mode (защита биты), st_ino (номер индекса), 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 соответственно.

11 голосов
/ 26 октября 2008

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

4 голосов
/ 17 октября 2018

В Python 3.4 и выше вы можете использовать объектно-ориентированный интерфейс pathlib module , который включает в себя оболочки для большей части модуля 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.

3 голосов
/ 26 октября 2008
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
2 голосов
/ 03 декабря 2018
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
1 голос
/ 11 февраля 2015

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