Документы Python 2 для filecmp()
говорят:
Если неглубоко задано и является ложным, файлы с идентичными os.stat()
сигнатурами считаются равными.
Звучит как два файла, которые идентичны, за исключением подписи os.stat()
, которая будет считаться неравной, однако это не так, как показано на примере следующего фрагмента кода:
import filecmp
import os
import shutil
import time
with open('test_file_1', 'w') as f:
f.write('file contents')
shutil.copy('test_file_1', 'test_file_2')
time.sleep(5) # pause to get a different time-stamp
os.utime('test_file_2', None) # change copied file's time-stamp
print 'test_file_1:', os.stat('test_file_1')
print 'test_file_2:', os.stat('test_file_2')
print 'filecmp.cmp():', filecmp.cmp('test_file_1', 'test_file_2')
Выход:
test_file_1: nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0,
st_uid=0, st_gid=0, st_size=13L, st_atime=1320719522L, st_mtime=1320720444L,
st_ctime=1320719522L)
test_file_2: nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0,
st_uid=0, st_gid=0, st_size=13L, st_atime=1320720504L, st_mtime=1320720504L,
st_ctime=1320719539L)
filecmp.cmp(): True
Как вы видите метки времени двух файлов & mdash; st_atime
, st_mtime
и st_ctime
& mdash; явно не то же самое, но filecmp.cmp()
указывает на то, что они идентичны. Я что-то неправильно понимаю или есть ошибка в реализации filecmp.cmp()
или ее документации?
Обновление
Документация Python 3 была перефразирована и в настоящее время говорит следующее: это ИМХО является улучшением только в том смысле, что лучше подразумевает, что файлы с разными временными метками все еще могут считаться равными, даже когда shallow
это правда.
Если значение shallow равно true, файлы с идентичными os.stat()
сигнатурами
принято равным. В противном случае содержимое файлов сравнивается.
FWIW Я думаю, что было бы лучше просто сказать что-то вроде этого:
Если shallow имеет значение true, содержимое файла сравнивается только тогда, когда
os.stat()
подписи неравны.