ไลบรารีมาตรฐานของ Python มีโมดูล filecmp ที่นิยามฟังก์ชันสำหรับเปรียบเทียบไฟล์และไดเรกทอรี การเปรียบเทียบนี้คำนึงถึงคุณสมบัติของไฟล์นอกจากข้อมูลภายใน
โค้ดตัวอย่างในบทความนี้ใช้โครงสร้างไฟล์และไดเรกทอรีดังนี้:
สร้างไดเรกทอรี dir1 และ dir2 ภายใต้ current working directory มีไฟล์ดังนี้:
--dir1/newfile.txt-- This is a file in dir1 --dir1/file1.txt-- Hello Python --dir1/file2.txt-- Python Standard Library --dir2/file1.txt-- Hello Python --dir2/file2.txt-- Python Library
มาอธิบายฟังก์ชันเปรียบเทียบต่างๆ ในโมดูล filecmp:
filecmp.cmp(f1, f2, shallow=True)
ฟังก์ชันนี้เปรียบเทียบสองไฟล์และคืนค่า True หากเหมือนกัน False หากไม่เหมือน พารามิเตอร์ shallow เป็น True โดยค่าเริ่มต้น ดังนั้น metadata ของไฟล์จะถูกพิจารณาในการเปรียบเทียบนอกจากเนื้อหา หากตั้ง shallow เป็น False จะเปรียบเทียบเฉพาะเนื้อหา
จากโครงสร้างไฟล์ โค้ดต่อไปให้ผลลัพธ์ดังแสดง:
Differing files: ['file2.txt']
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt')
True
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt', shallow=False)
True
>>> filecmp.cmp('dir1/file2.txt', 'dir2/file2.txt')
False
filecmp.cmpfiles(dir1, dir2, shallow)
ฟังก์ชันนี้เปรียบเทียบไฟล์ในสองไดเรกทอรีและคืนค่า tuple สามรายการ รายการแรกคือลิสต์ไฟล์ที่ตรงกัน รายการที่สองคือลิสต์ไฟล์ที่ไม่ตรงกัน และรายการที่สามคือลิสต์ไฟล์ร่วมกัน
>>> match, mismatch, errors = filecmp.cmpfiles('dir1', 'dir2', ['file1.txt', 'file2.txt'])
>>> match
['file1.txt']
>>> mismatch
['file2.txt']
>>> errors
[]
โมดูล filecmp ยังนิยามคลาส dircmp ออบเจ็กต์ของมันคือออบเจ็กต์เปรียบเทียบไดเรกทอรี เปรียบเทียบไฟล์ในสองไดเรกทอรี ที่ระบุว่าเป็น left และ right directories ออบเจ็กต์สามารถเรียกใช้เมธอดต่างๆ ได้ดังนี้:
filecmp.dircmp(a, b)
เป็นคอนสตรัคเตอร์ a และ b คือไดเรกทอรีที่จะเปรียบเทียบ โดยค่าเริ่มต้นไฟล์ระบบในไดเรกทอรีจะถูกซ่อนและไม่นำมาพิจารณา
>>> result = filecmp.dircmp('dir1', 'dir2')
เมธอดอื่นๆ ในคลาส dircmp ดังนี้:
report()
เมธอดนี้พิมพ์ผลการเปรียบเทียบระหว่างไดเรกทอรี:
>>> result = filecmp.dircmp('dir1', 'dir2')
>>> result.report()
diff dir1 dir2
Only in dir1: ['newfile.txt']
Identical files: ['file1.txt']
Differing files: ['file2.txt']
left, right
พรอพเพอร์ตี้เหล่านี้พิมพ์ชื่อไดเรกทอรีแรกและที่สองในคอนสตรัคเตอร์ dircmp:
>>> result.left 'dir1' >>> result.right 'dir2'
left_list, right_list
แอตทริบิวต์เหล่านี้คืนค่าลิสต์ไฟล์ในทั้งสองไดเรกทอรี:
>>> result.left_list ['file1.txt', 'file2.txt', 'newfile.txt'] >>> result.right_list ['file1.txt', 'file2.txt']
common, common_files, common_dirs
แอตทริบิวต์เหล่านี้คืนค่าไฟล์และไดเรกทอรีร่วมกัน ไฟล์ร่วมกันอย่างเดียว และไดเรกทอรีร่วมกันอย่างเดียว:
>>> result.common ['file1.txt', 'file2.txt'] >>> result.common_files ['file1.txt', 'file2.txt'] >>> result.common_dirs []
same_files, diff_files
แอตทริบิวต์เหล่านี้คืนค่าลิสต์ไฟล์ที่เหมือนกันและไฟล์ที่ต่างกัน โดยใช้ตัวดำเนินการเปรียบเทียบที่นิยามในคลาส dircmp:
>>> result.same_files ['file1.txt'] >>> result.diff_files ['file2.txt']
บทความนี้อธิบายคลาส dircmp เมธอดต่างๆ และฟังก์ชันเปรียบเทียบไฟล์ที่นิยามในโมดูล filecmp