Какой самый элегантный способ проверить файлы для равенства в Python? Контрольная сумма? Байт сравнивает? Думайте, что файлы не будут больше 100-200 МБпроверить файлы для равенства
ответ
использовать 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
Хорошо, для этого могут потребоваться два отдельных ответа.
Если у вас есть много файлов для сравнения, перейдите к контрольной сумме и кешируйте контрольную сумму для каждого файла. Разумеется, впоследствии сравните байт сопоставления файлов для байта.
Если у вас есть только два файла, перейдите непосредственно для сравнения байтов, потому что вы все равно должны прочитать файл, чтобы вычислить контрольную сумму.
В обоих случаях используйте размер файла как ранний способ проверки неравенства.
Я бы сделал контрольную сумму с MD5 (например) вместо байта comaprasion плюс проверка даты и зависит от того, вам нужна проверка имени.
Какая дата файла связана с его содержимым? – Joey 2010-11-26 08:37:12
Контрольная сумма - хорошее решение, я согласен, но что вы имеете в виду, говоря «даты проверки»? – 2010-11-26 08:39:15
Вам не нужно читать оба файла, чтобы получить их контрольную сумму? Если это так, то я думаю, что вся контрольная сумма добавляет риск столкновения. Изменить: если вы не хотите сравнивать несколько файлов, как только что сказал Джои в ответ. – aaronasterling 2010-11-26 08:41:57
Как насчет обстрела 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!"
Перед выполнением любой из других решений, вы можете захотеть сделать 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
насчет filecmp
модуль? Он может сравнивать файлы по-разному с различными компромиссами.
И еще лучше, если она является частью стандартной библиотеки:
- 1. ActiveModel: проверить значение для равенства
- 2. VB.Net: проверить несколько значений для равенства?
- 3. проверить строку для равенства с несколькими опциями
- 4. Проверить функции для равенства внутри макроса
- 5. Scala как проверить Единицу для равенства?
- 6. Как проверить (ActiveRecord) объекта равенства
- 7. Как проверить объект контент равенства не объект ссылки равенства
- 8. Есть ли простой способ проверить два PNG для равенства?
- 9. Как проверить регистр равенства строк в xsl
- 10. Как проверить 2 даты равенства в JavaScript
- 11. Как проверить два адреса электронной почты для равенства
- 12. Можно ли проверить два экземпляра ArrayList (C#) для равенства значений?
- 13. Что такое хороший способ проверить проанализированные json-карты для равенства?
- 14. Как проверить два массива объектов для равенства в JUnit?
- 15. Как проверить ссылочное равенство для типа, реализующего оператор равенства?
- 16. Как проверить список элементов ссылок C++/cli для равенства?
- 17. Сравнение текстовых файлов для равенства
- 18. Определение равенства для неизвестных типов
- 19. сравнивающие вложенные массивы для равенства
- 20. Алгоритм для определения угла равенства
- 21. Тестирование параметров шаблона для равенства
- 22. Использование re для равенства
- 23. Перегрузка равенства для namedtuple
- 24. Сравнение потоков для равенства
- 25. Проверка равенства для циклов
- 26. шаблон соответствия для равенства
- 27. сравнить treeet для равенства
- 28. Конгруэнтности для гетерогенного равенства
- 29. Сравните макросы препроцессора для равенства
- 30. Проблемы равенства равенства Scala XML
Даже при сравнении нескольких файлов, контрольная сумма может быть контрпродуктивным. Если вы просто хотите проверить, что `a == b == c == d`, то я не вижу смысла. Если вы хотите что-то вроде `e in (a, b, c, d)`, и тогда вы хотите сделать это с помощью `e, f, g` и т. Д., То я думаю, что контрольная сумма начинает платить за себя. – aaronasterling 2010-11-26 08:50:42
Ну, наиболее распространенным случаем для сравнения нескольких файлов является поиск дубликатов. По крайней мере, я редко видел необходимость убедиться, что несколько файлов похожи друг на друга. – Joey 2010-11-26 10:07:58