Я попробовал все перечисленные выше решения, но ничего не получилось. Это то, что сработало для меня.
Получение какой-либо даты модификации кросс-платформенным способом легко - просто вызовите os.path.getmtime(path)
, и вы получите отметку времени Unix, когда последний файл в path
был последним изменен.
Получение дат создания файла , с другой стороны, неудобно и зависит от платформы, различающееся даже между тремя большими ОС: Положив все это вместе, межплатформенный код должен выглядеть примерно так ...
ctime
файла (задокументированный в https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) сохраняет дату создания. Вы можете получить доступ к этому в Python через os.path.getctime()
или атрибут .st_ctime
результата вызова os.stat()
. Этот не будет работать в Unix, где ctime
- последний раз, когда атрибуты или содержимое файла были изменены . .st_birthtime
результата вызова os.stat()
. 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
Лучшей функцией для этого является 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)
getmtime
- ближайшая вещь, доступная в Unix (где получение дат создания невозможно), но определенно не самая лучшая функция для использования в Windows, где ctime
- время создания.
– Mark Amery
12 September 2016 в 20:00
Есть два способа получить время мода, os.path.getmtime () или os.stat (), но ctime не является надежной кросс-платформенной (см. ниже).
getmtime ( путь ) Возвращает время последней модификации пути. Возвращаемое значение - это число, указывающее количество секунд с момента (см. Модуль времени). Поднимите os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если os.stat_float_times () возвращает True, результатом будет число с плавающей запятой.
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 соответственно.
Я смог получить время создания в posix, запустив команду 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 - это создание файла (а не время смены времени, как отмечалось в других комментариях).
os.stat https://docs.python.org/2/library/stat.html#module-stat
изменить: в более новом коде вы, вероятно, должны использовать os.path.getmtime () (спасибо Кристиан Оудар), но обратите внимание, что он возвращает значение с плавающей запятой time_t с долей секунд (если ваша ОС поддерживает его)
os.path.getmtime()
существует с Python 1.5.2 (см. старые документы ), выпущенные до того, как я потерял большинство своих детских зубов и почти за десять лет до того, как вы написали оригинальную версию этого ответа.
– Mark Amery
12 September 2016 в 19:04
Если следующие символические ссылки не важны, вы также можете использовать встроенный 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
os.stat
возвращает именованный кортеж с атрибутами st_mtime
и st_ctime
. Время модификации st_mtime
на обеих платформах; к сожалению, в Windows, ctime
означает «время создания», тогда как на POSIX это означает «время изменения». Я не знаю, как получить время создания на платформах POSIX.
dir(..)
на одном. Например. dir(os.stat(os.listdir('.')[0]))
– Evgeni Sergeev
16 October 2013 в 10:20
У вас есть несколько вариантов. Для этого вы можете использовать функции 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()
указывает, что not относится к времени создания в системах * nix, а скорее в последний раз, когда изменились данные inode. (спасибо kojiro за то, что этот факт более ясен в комментариях, предоставив ссылку на интересный пост в блоге)
ctime
обновляется всякий раз, когда mtime
делает (поскольку mtime
является «метаданные»), и поэтому ctime
обычно всегда равным или впереди i> mtime
. Обработка ctime
как "созданная" время, таким образом, не имеет никакого смысла. -1!
– Mark Amery
12 September 2016 в 20:15
os.stat
включает время создания. Нет никакого определения st_anything для элемента os.stat()
, который содержит время.
Итак, попробуйте это:
os.stat('feedparser.py')[8]
Сравните это с вашим создать дату в файле в ls -lah
Они должны быть одинаковыми.
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>>
ext4
в Linux, и я хотел бы узнать, что происходит, когда Linux читает файлы, написанные Windows, или наоборот, учитывая, что они используютst_ctime
иначе. – Mark Amery 14 September 2016 в 23:59"w"
, он не заменяет его, он просто открывает существующий файл и обрезает его. Несмотря на то, что содержимое файла полностью не связано с тем, что было при создании, вам все равно будет сказано, что файл был «создан». задолго до текущей версии. И наоборот, редакторы, использующие атомарную замену в save (исходный файл заменяется новым временным файлом temp), показывают более новую дату создания, даже если вы просто удалили один символ. Используйте время модификации, не тратьте время на создание. – ShadowRanger 17 October 2016 в 14:00stat.st_ctime
более уместно, потому что во многих случаях время последнего изменения метаданных i> может быть временем создания (по крайней мереctime
ближе к реальное время создания i>, чемmtime
). Поэтому вы можете просто заменить свой фрагмент наstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. Как вы думаете? ура – olibre 7 August 2017 в 15:31ctime
всегда должны быть равны или позже i>, чемmtime
, потому что изменениеmtime
вызывает i> actime
изменяется (поскольку самmtime
рассматривается как «метаданные»). См. stackoverflow.com/a/39521489/1709587 , где я приводим примерный код, чтобы проиллюстрировать это. – Mark Amery 9 August 2017 в 11:08