filecmp.cmp () игнорирует различные подписи os.stat ()? - PullRequest
5 голосов
/ 08 ноября 2011

Документы 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() подписи неравны.

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011

Вы неправильно понимаете документацию.Строка # 2 гласит:

Если поверхностный не задан и имеет значение false, файлы с идентичными os.stat() сигнатурами считаются равными.

Файлы с идентичными os.stat() сигнатурами считаются равными, но логический обратный не соответствует действительности: файлы с неравными сигнатурами os.stat() не обязательно считаются неравными.Скорее, они могут быть неравными, и в этом случае сравнивается фактическое содержимое файла.Поскольку содержимое файла установлено как идентичное, filecmp.cmp() возвращает True.

В соответствии с третьим предложением, как только он определит, что файлы равны, он будет кешировать этот результат и не будет беспокоить повторное чтениесодержимое файла, если вы попросите его снова сравнить те же файлы, , если структуры os.stat этих файлов не изменятся .

1 голос
/ 30 января 2013

Кажется, что «катиться самостоятельно» - это действительно то, что требуется для получения желаемого результата.Было бы просто хорошо, если бы документация была достаточно ясной, чтобы случайный читатель мог прийти к такому выводу.

Вот функция, которую я сейчас использую:

def cmp_stat_weak(a, b):
    sa = os.stat(a)
    sb = os.stat(b)
    return (sa.st_size == sb.st_size and sa.st_mtime == sb.st_mtime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...