Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Низкий уровень путь:
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):
...
Если Вы идете для даже основной эффективности, Вы, вероятно, хотите проверить размер файла сначала:
if os.path.getsize(filename1) == os.path.getsize(filename2):
if open('filename1','r').read() == open('filename2','r').read():
# Files are the same.
Это сохраняет Вас читающий каждую строку двух файлов, которые не являются даже тем же размером, и таким образом не могут быть тем же.
(Еще больше, чем который, Вы могли обратиться к быстрому MD5sum каждого файла и сравнить тех, но это не "в Python", таким образом, я остановлюсь здесь.)
Это - функция сравнения файлов функционального стиля. Это возвращает немедленно 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])
Просто различное взятие:)
Так как я не могу прокомментировать ответы других, я запишу свое собственное.
при использовании 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()
f = open(filename1, "r").read()
f2 = open(filename2,"r").read()
print f == f2
Я использовал бы хеш содержания файла с помощью 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!'