Модифицированное время использования os.stat в Python уменьшается при копировании файлов.

Проблема, с которой я сталкиваюсь, является частью использования os.stat на пути (например, C:\myfile1.txt). Когда я запускаю os.stat для этого файла и беру 9-й элемент в результирующем списке, я получаю измененное время в виде некоторых чисел (например, 1348167977).

ПРИМЕЧАНИЕ. Я не уверен, как рассчитываются эти числа.

Когда я создаю C:\myfile1.txt, он имеет номер, как в примере выше. Если я создам другой файл C:\myfile2.txt, он получит новое число, представляющее время изменения, которое выше, чем C:\myfile1.txt (как я и ожидал). У меня также есть третий файл C:\myfile3.txt, который создается последним.

Проблема возникает, если я копирую C:\myfile2.txt и перезаписываю C:\myfile3.txt результирующим файлом копии, время изменения, показанное os.stat в новом C:\myfile3.txt, меньше, чем C:\ мой файл1.txt. Почему это происходит? Время модификации для C:\myfile3.txt должно быть самым высоким из всех или, по крайней мере, равным C:\myfile2.txt.

Спасибо за ответы, надеюсь, я объяснил это достаточно хорошо.

РЕДАКТИРОВАТЬ:

Вот пример кода для проверки того, что я описываю. Иногда это работает, иногда цифры все те же, если вы перезапустите его в другое время. Я думаю, что просто не совсем понимаю MTIME, которое я вывожу.

import os
import shutil
import time

myfile1 = open("C:\\myfile1.txt", 'wt')
myfile1.close()
time.sleep(10)
myfile2 = open("C:\\myfile2.txt", 'wt')
myfile2.close()
time.sleep(10)
myfile2 = open("C:\\myfile3.txt", 'wt')
myfile2.close()

shutil.copyfile("C:\\myfile2.txt", "C:\\myfile3.txt")

modified_time_first = (os.stat("C:\\myfile1.txt")[9])
modified_time_second = (os.stat("C:\\myfile2.txt")[9])
modified_time_third = (os.stat("C:\\myfile3.txt")[9])

print "The first files modified time is: "
print modified_time_first
print ""

print "The second files modified time is: " 
print modified_time_second
print ""

print "The third files modified time is: " 
print modified_time_third
print ""

person Brad Conyers    schedule 20.09.2012    source источник
comment
Кстати, чтобы понять эти значения (которые представляют собой количество секунд с 1 января 1970 года), используйте time.ctime(1348167977).   -  person Harel    schedule 20.09.2012
comment
Спасибо, Харел! Это большая помощь.   -  person Brad Conyers    schedule 20.09.2012


Ответы (2)


Число, которое вы видите, является отметкой времени UNIX и представляет количество секунд, прошедших с начала эпохи, 1-й января 1970 года. Вы можете использовать datetime.datetime.fromtimestamp(), чтобы превратить это в объект даты и времени python, например:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1348167977)
datetime.datetime(2012, 9, 20, 21, 6, 17)

Обратите внимание, что os.stat() возвращает именованный кортеж; вы также можете получить доступ к свойствам этого кортежа по имени:

>>> import os
>>> os.stat('test.txt').st_mtime
1348169795.0

Все доступные атрибуты см. в os.stat() документации.

Вы, с другой стороны, вместо этого получили доступ к значению st_ctime; индексы кортежей и списков Python начинаются с 0, поэтому элемент 9th имеет индекс 8. Вы получили доступ к индексу 10, времени создания файлов.

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

>>> os.path.getmtime('test.txt')
1348169795.0
>>> datetime.datetime.fromtimestamp(os.path.getmtime('test.txt'))
datetime.datetime(2012, 9, 20, 21, 36, 35)

При копировании файла обычно включаются его свойства, такие как отметка времени последней модификации, поэтому время изменения вновь скопированного файла может легко измениться как назад, так и вперед. То же самое относится и к времени создания.

person Martijn Pieters    schedule 20.09.2012
comment
Это именно то, что мне нужно, используя st_mtime, он фиксирует фактическое время модификации. По какой-то причине просто захват MTIME (девятый элемент в кортеже os.stat() ) не очень часто обновлялся. Спасибо еще раз! - person Brad Conyers; 21.09.2012
comment
@BradConyers: я просто уточнял. os.stat()[9] — это 10-й элемент, время создания, а не время изменения. :-) Еще одна причина использовать именованные атрибуты кортежа или удобный метод os.path.getmtime(). - person Martijn Pieters; 21.09.2012

Навскидку строка выглядит в формате «время эпохи». Я использую ипитон:

import os
import time
time.ctime(os.stat('index.php')[9])
==>'Fri Jun 15 23:05:07 2012'

Я использую Mac OS X, поэтому я сделал man stat. Похоже, что 9-й элемент, возвращаемый stat, — это «ctime». «ctime» в мире * nix относится к информации об изменении данных inode. Вероятно, вы могли бы проверить, следует ли изменять это поле, выполняя операцию, которую вы выполняете, или нет. Вероятно, вы могли бы сделать это вручную и запустить stat для сгенерированных файлов, чтобы подтвердить, должно ли это измениться. Возможно, вы выбрали не ту часть os.stat.

person terryjbates    schedule 20.09.2012