我不在乎差異是什麼。我只是想知道內容是否不同。在Python中,是否有比較兩個文本文件的內容是否相同的簡明方式?
38
A
回答
49
低級別的方法:
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):
...
3
f = open(filename1, "r").read()
f2 = open(filename2,"r").read()
print f == f2
+5
「嗯,我有這個8 GiB文件和我想比較的那個32 GiB文件...」 – tzot 2008-10-31 23:19:37
22
如果你打算爲連基本的效率,您可能需要首先檢查文件大小:
if os.path.getsize(filename1) == os.path.getsize(filename2):
if open('filename1','r').read() == open('filename2','r').read():
# Files are the same.
這樣可以節省您的閱讀每兩行文件的大小並不相同,因此不能相同。
(甚至更重要的是,你可以調用出每個文件的快速MD5SUM和比較這些,但是這不是「在Python」,所以我會在這裏停下來。)
1
1
我會使用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!'
5
因爲我不能評論別人的答案我會寫我自己的。
如果你使用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()
7
這是一種功能樣式的文件比較功能。如果文件具有不同的大小,它立即返回False;否則,它讀取4KiB塊大小,並立即在第一差返回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])
只是不同的看法:)
0
from __future__ import with_statement
filename1 = "G:\\test1.TXT"
filename2 = "G:\\test2.TXT"
with open(filename1) as f1:
with open(filename2) as f2:
file1list = f1.read().splitlines()
file2list = f2.read().splitlines()
list1length = len(file1list)
list2length = len(file2list)
if list1length == list2length:
for index in range(len(file1list)):
if file1list[index] == file2list[index]:
print file1list[index] + "==" + file2list[index]
else:
print file1list[index] + "!=" + file2list[index]+" Not-Equel"
else:
print "difference inthe size of the file and number of lines"
相關問題
- 1. 比較兩個文件,看它們在PHP中是否相同
- 2. Python:檢查「兩個」.doc文件是否是相同的文件?
- 3. 比較兩個圖像是否相同
- 4. 如何比較最新的兩個文件是否相同或不相同?
- 5. 什麼是正確的方式來比較兩個文件名,看看他們是否是同一個文件?
- 6. 檢查Applescript中是否有兩個文件是相同的
- 7. 比較一個文件的兩列在linux中是否具有同一性
- 8. 比較內容中有多個文件的兩個文件夾
- 9. 如何比較兩個文本文件的內容並返回「相同內容」或「不同內容」?
- 10. 如何比較2個xml文件知道它是否相同
- 11. 如何比較兩個具有相似內容的文件
- 12. 比較XmlDocument是否相等(內容明智)
- 13. C#比較圖像:圖像的文件是否相同
- 14. 比較兩個文本文件相互
- 15. 檢測兩個文件是否嚴格相同,要比較什麼?
- 16. 比較Python中的文件內容
- 17. JUnit:比較兩個無序文本文件的內容
- 18. 在asp.net MVC 6的Views文件夾中是否有與web.config相同的內容?
- 19. 比較文件和列表,看看它們是否相同
- 20. 是否可以比較python中的csv和文本文件的值?
- 21. 是否有比較/比較兩個Java包的體面工具?
- 22. 比較CMD中非相同文件的兩個文件夾
- 23. 比較兩次公差是否相等?
- 24. 比較兩組是否相等遞歸?
- 25. 如何檢查兩個元素是否具有相同的文本格式?
- 26. 是否有與插件中的Bootstrap類相同的內容
- 27. 是否有簡單的任何方式來應用HTML中相同區域的「CSS樣式比較」?
- 28. 比較會話值是否與文本框的值相匹配
- 29. 比較兩個日期時,他們是否需要使用相同的格式?
- 30. 如何比較C++中的兩個ostream對象是否相等?
我糾正你的filecmp.cmp電話,因爲不存在非真淺論點,它沒有做問題所要求的。 – tzot 2008-10-31 23:11:49
你是對的。 http://www.python.org/doc/2.5.2/lib/module-filecmp.html。非常感謝你。 – 2008-11-01 03:21:44
btw,應該以二進制模式打開文件以確保文件可以在行分隔符中有所不同。 – newtover 2013-04-29 10:30:52