У меня есть сценарий, который должен выполнять некоторые действия на основе дат создания и изменения файлов, но он должен работать под Linux и Windows.
Какой лучший кроссплатформенный способ получить дату/время создания и модификации файлов в Python?
У вас есть несколько вариантов. Во-первых, вы можете использовать функции 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 за то, что он разъяснил этот факт в комментариях, дав ссылку на интересную статью в блоге)
Получая какое-то дата модификации в кросс-платформенным способом легко - просто позвоните в<код>В ОС.путь.getmtime(<и>путь</я и GT;)</код> и вы'll получить в Unix метка времени файла в путь
был изменен в последний раз.
Получаете файл создание даты, с другой стороны, это сложное и зависимое от платформы, различающихся между трех больших операционки:
чтимы
(описана в https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx) хранит дату создания. Вы можете получить доступ к этому в Python посредством ОС .путь.getctime()
или .st_ctime
атрибут результатом вызова ОС.стат()
. Это выиграл'т работа на Unix, где-то ctime` в последний раз, что файл'с атрибутами или содержание были изменены..атрибут st_birthtime
в результате вызова ОС.стат()`.в ext4
хранит их в st_crtime) , ядра Linux [гости не способ доступа им](https://unix.stackexchange.com/questions/91197/how-to-find-creation-date-of-file); в частности, структуры его возвращения из стат()
вызывает В С, на последнюю версию ядра, Дон'т содержать дату создания полей. Вы также можете увидеть, что st_crtime идентификатор `` не'т, в настоящее время расположенный в любой точке источник питон. По крайней мере, если вы'вновь на в ext4, с данными в добавленные в индексных дескрипторов в файловой системе, но там's никакой удобный способ доступа к нему.Следующий лучший вещь в Linux получить доступ к файлу'ы время изменения
, либо через ОС.путь.getmtime()
или .тип доступа
атрибут ОС.стат()
результат. Это даст вам последний раз файл'содержание s был изменен, который может быть адекватным в некоторых случаях.
Собрал все воедино, кросс-платформенный код должен выглядеть что-то вроде этого...
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
Лучшие функции для использования для это ОС.путь.getmtime()]1. Внутренне, это просто использует ОС.стат(именем).тип доступа`.
Модуль 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.path.getmtime() (спасибо Christian Oudard) но обратите внимание, что он возвращает значение time_t с плавающей точкой с долями секунд (если ваша ОС поддерживает это)
Существует два метода получения модального времени, os.path.getmtime() или os.stat(), но ctime не является надежным кросс-платформенным (см. ниже).
getmtime(путь)
Возвращает время последней модификации пути. Возвращаемое значение - число, дающее
количество секунд с момента эпохи (см. модуль time). Вызывает os.error, если файл
не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если
os.stat_float_times() возвращает True, результатом будет число с плавающей точкой.
stat(path)
Выполните системный вызов stat() для заданного пути. Возвращаемым значением является объект, чьи
атрибуты которого соответствуют членам структуры 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, соответственно.
ОС.стат
возвращает именованный кортеж с тип доступа " и " st_ctime
атрибутами. Время изменения тип доступа на обеих платформах, но, к сожалению, на окна, временные метки ctime
означает "Создание время", тогда как в POSIX-это означает "Время перемен" и. Я'м не знаю ни одного способа, чтобы получить время создания на POSIX платформах.
В Python 3.4 и выше, можно использовать объектно-ориентированный модуль pathlib интерфейс, который включает в себя фантики для большей части модуля ОС. Вот пример получения файла Stats.
>>> 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)
Для получения дополнительной информации о том, что ОС.stat_result содержит, см. В [документации](https://docs.python.org/3/library/os.html#os.stat_result). За время изменения вы хотите
имени.стат().тип доступа`:
>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)
Если вы хотите, чтобы время создания на Windows, или самое последнее изменение метаданных на Unix, вы можете использовать имени.стат().st_ctime
:
>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
В данной статье есть более полезная информация и примеры для модуля pathlib.
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
Если символические ссылки не важно, вы также можете использовать ОС.встроенные 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
ОС.стат
включает время создания. Там's просто нет определения st_anything элемент ОС.стат ()
, которая содержит время.
Так что попробуйте это:
ОС.стат('feedparser, основанная на.пы')[8]
Сравните это с создания датой файла в LS-Лах
Они должны быть одинаковыми.
Может стоит взглянуть на crtime
библиотеку, которая реализует кросс-платформенный доступ к времени создания файла.
`` от импорта crtime get_crtimes_in_dir
для имени, даты в get_crtimes_in_dir (и"." Ну, raise_on_error=правда, as_epoch=ложные): печати(имени, даты)
Я был в состоянии получить время создания в POSIX, запустив систему'команда stat S и анализа выходных данных.
commands.getoutput('stat FILENAME').split('\"')[7]
Работает стат за пределами Python из терминала (ОС Х) возвращается:
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
... где четвертая даты и времени создания файлов (а не чтимы времени меняться, как и другие комментарии не указано).