2010-11-26 2 views

ответ

4

использовать hashlib для получения md5 каждого файла и сравнить результаты.

#! /bin/env python 
import hashlib 
def filemd5(filename, block_size=2**20): 
    f = open(filename) 
    md5 = hashlib.md5() 
    while True: 
     data = f.read(block_size) 
     if not data: 
      break 
     md5.update(data) 
    f.close() 
    return md5.digest() 

if __name__ == "__main__": 
    a = filemd5('/home/neo/todo') 
    b = filemd5('/home/neo/todo2') 
    print(a == b) 

Обновление: На Python 2.1 есть filecmp module, что делает именно то, что вы хотите, и есть методы для сравнения каталогов тоже. Я никогда не знал об этом модуле, я все еще учусь Python сам :-)

>>> import filecmp 
>>> filecmp.cmp('undoc.rst', 'undoc.rst') 
True 
>>> filecmp.cmp('undoc.rst', 'index.rst') 
False 
4

Хорошо, для этого могут потребоваться два отдельных ответа.

Если у вас есть много файлов для сравнения, перейдите к контрольной сумме и кешируйте контрольную сумму для каждого файла. Разумеется, впоследствии сравните байт сопоставления файлов для байта.

Если у вас есть только два файла, перейдите непосредственно для сравнения байтов, потому что вы все равно должны прочитать файл, чтобы вычислить контрольную сумму.

В обоих случаях используйте размер файла как ранний способ проверки неравенства.

+0

Даже при сравнении нескольких файлов, контрольная сумма может быть контрпродуктивным. Если вы просто хотите проверить, что `a == b == c == d`, то я не вижу смысла. Если вы хотите что-то вроде `e in (a, b, c, d)`, и тогда вы хотите сделать это с помощью `e, f, g` и т. Д., То я думаю, что контрольная сумма начинает платить за себя. – aaronasterling 2010-11-26 08:50:42

+1

Ну, наиболее распространенным случаем для сравнения нескольких файлов является поиск дубликатов. По крайней мере, я редко видел необходимость убедиться, что несколько файлов похожи друг на друга. – Joey 2010-11-26 10:07:58

-2

Я бы сделал контрольную сумму с MD5 (например) вместо байта comaprasion плюс проверка даты и зависит от того, вам нужна проверка имени.

+2

Какая дата файла связана с его содержимым? – Joey 2010-11-26 08:37:12

+0

Контрольная сумма - хорошее решение, я согласен, но что вы имеете в виду, говоря «даты проверки»? – 2010-11-26 08:39:15

+2

Вам не нужно читать оба файла, чтобы получить их контрольную сумму? Если это так, то я думаю, что вся контрольная сумма добавляет риск столкновения. Изменить: если вы не хотите сравнивать несколько файлов, как только что сказал Джои в ответ. – aaronasterling 2010-11-26 08:41:57

-2

Как насчет обстрела cmp?

import commands 
status, output = commands.getstatusoutput("/usr/bin/cmp file1 file2") 
if (status == 0): 
    print "files are same" 
elif (status == 1): 
    print "files differ" 
else: 
    print "uh oh!" 
0

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

Конечно, это помогает только в том случае, если размер файла не установлен.

Пример:

def foo(f1, f2): 
    if not os.path.getsize(f1) == os.path.getsize(f2): 
     return False # Or similar 

    ... # Checksumming/byte-comparing/whatever 
9

насчет filecmp модуль? Он может сравнивать файлы по-разному с различными компромиссами.

И еще лучше, если она является частью стандартной библиотеки:

http://docs.python.org/library/filecmp.html

Смежные вопросы