Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การเปรียบเทียบไฟล์และไดเรกทอรีใน Python

ไลบรารีมาตรฐานของ 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