В Python, там краткий способ выдержать сравнение, является ли содержание двух текстовых файлов тем же?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
50
задан Mr_and_Mrs_D 10 December 2016 в 05:20
поделиться

7 ответов

Низкий уровень путь:

from __future__ import with_statement
with open(filename1) as f1:
   with open(filename2) as f2:
      if f1.read() == f2.read():
         ...

путь высокого уровня:

import filecmp
if filecmp.cmp(filename1, filename2, shallow=False):
   ...
64
ответ дан tzot 7 November 2019 в 10:44
поделиться

Если Вы идете для даже основной эффективности, Вы, вероятно, хотите проверить размер файла сначала:

if os.path.getsize(filename1) == os.path.getsize(filename2):
  if open('filename1','r').read() == open('filename2','r').read():
    # Files are the same.

Это сохраняет Вас читающий каждую строку двух файлов, которые не являются даже тем же размером, и таким образом не могут быть тем же.

(Еще больше, чем который, Вы могли обратиться к быстрому MD5sum каждого файла и сравнить тех, но это не "в Python", таким образом, я остановлюсь здесь.)

24
ответ дан Rich 7 November 2019 в 10:44
поделиться

Это - функция сравнения файлов функционального стиля. Это возвращает немедленно False, если файлы имеют различные размеры; иначе это читает в размерах блока на 4 кибибита и возвращает False немедленно на первое различие:

from __future__ import with_statement
import os
import itertools, functools, operator

def filecmp(filename1, filename2):
    "Do the two files have exactly the same contents?"
    with open(filename1, "rb") as fp1, open(filename2, "rb") as fp2:
        if os.fstat(fp1.fileno()).st_size != os.fstat(fp2.fileno()).st_size:
            return False # different sizes ∴ not equal
        fp1_reader= functools.partial(fp1.read, 4096)
        fp2_reader= functools.partial(fp2.read, 4096)
        cmp_pairs= itertools.izip(iter(fp1_reader, ''), iter(fp2_reader, ''))
        inequalities= itertools.starmap(operator.ne, cmp_pairs)
        return not any(inequalities)

if __name__ == "__main__":
    import sys
    print filecmp(sys.argv[1], sys.argv[2])

Просто различное взятие:)

10
ответ дан jamylak 7 November 2019 в 10:44
поделиться

Так как я не могу прокомментировать ответы других, я запишу свое собственное.

при использовании md5 Вы определенно не должны просто md5.update (f.read ()), так как Вы будете использовать слишком много памяти.

def get_file_md5(f, chunk_size=8192):
    h = hashlib.md5()
    while True:
        chunk = f.read(chunk_size)
        if not chunk:
            break
        h.update(chunk)
    return h.hexdigest()
6
ответ дан user32141 7 November 2019 в 10:44
поделиться

f = open(filename1, "r").read()
f2 = open(filename2,"r").read()
print f == f2


2
ответ дан mmattax 7 November 2019 в 10:44
поделиться

Для больших файлов Вы могли вычислить MD5 или хеш SHA файлов.

2
ответ дан ConcernedOfTunbridgeWells 7 November 2019 в 10:44
поделиться

Я использовал бы хеш содержания файла с помощью MD5.

import hashlib

def checksum(f):
    md5 = hashlib.md5()
    md5.update(open(f).read())
    return md5.hexdigest()

def is_contents_same(f1, f2):
    return checksum(f1) == checksum(f2)

if not is_contents_same('foo.txt', 'bar.txt'):
    print 'The contents are not the same!'
2
ответ дан Jeremy Cantrell 7 November 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: