filecmp模塊用來比較目錄、文件是否相同丧荐。舉例如下:
構建兩個文件夾,其結構如圖所示:
其中data內(nèi)容保持一致喧枷,data1內(nèi)容不一致虹统,data2是tmp獨有弓坞,readme1和readme內(nèi)容一致。
如果單純比較兩個文件是否相同车荔,可以通過filecmp.cmp(f1, f2, shallow=True)實現(xiàn)渡冻。其中f1、f2是文件名忧便,shallow=True族吻,則通過文件的元信息比較是否一致,如果是False茬腿,則比較兩個文件內(nèi)容呼奢。
import filecmp
from pathlib import Path
def main():
filecmp.clear_cache() # 清除 filecmp 緩存
p = Path(".")
p1 = p / 'tmp' / 'data'
p2 = p / 'tmp' / 'data1'
print(filecmp.cmp(p1, p2))
if __name__ == '__main__':
main()
如果非遞歸比較兩個目錄中的一組文件,可以選擇通過filecmp.cmpfiles(dir1, dir2, common, shallow=True)實現(xiàn)切平。其中dir1握础、dir2是兩個文件夾,common是list悴品,里面是需要比較的共同文件名稱禀综。
import filecmp
from pathlib import Path
def main():
filecmp.clear_cache() # 清除 filecmp 緩存
p = Path(".")
p3 = p / 'tmp'
p4 = p / 'tmp1'
match, mismatch, error = filecmp.cmpfiles(p3, p4, common=['data', 'data1', 'data2'])
print(match, mismatch, error)
if __name__ == '__main__':
main()
對于大目錄樹的遞歸比較或者更完整的分析,可以選擇使用dircmp類苔严。
report() 打印兩個目錄報告定枷,非遞歸
report_full_closure() 遞歸打印兩個目錄
當然也可以通過更低級的API去實現(xiàn),參見dir_files_diff()
import filecmp
from filecmp import dircmp
from pathlib import Path
def dir_files_diff(dcmp: dircmp):
for name in dcmp.common_files:
print("the same file found in two dirs: %s" % name)
for name in dcmp.diff_files:
print("diff file found in two dirs: %s" % name)
for name_left in dcmp.left_only:
print("only found in left dir: %s/%s" % (dcmp.left, name_left))
for name_right in dcmp.right_only:
print("only found in right dir: %s/%s" % (dcmp.right, name_right))
for sub_dcmp in dcmp.subdirs.values():
dir_files_diff(sub_dcmp)
def main():
filecmp.clear_cache() # 清除 filecmp 緩存
p = Path(".")
dcmp = dircmp(p3, p4)
dcmp.report() # 只包括給定目錄的內(nèi)容的報告
dcmp.report_full_closure() # 遞歸比較后的報告
dir_files_diff(dcmp) # 自定義比較
if __name__ == '__main__':
main()
整體效果: