filecmp --- So sánh tệp và thư mục¶
Source code: Lib/filecmp.py
Mô-đun filecmp xác định các chức năng để so sánh các tệp và thư mục với nhiều sự cân bằng về thời gian/độ chính xác tùy chọn khác nhau. Để so sánh các tập tin, hãy xem thêm mô-đun difflib.
Mô-đun filecmp xác định các chức năng sau:
- filecmp.cmp(f1, f2, shallow=True)¶
So sánh các tệp có tên f1 và f2, trả về
Truenếu chúng có vẻ bằng nhau,Falsenếu không.Nếu shallow là đúng và chữ ký
os.stat()(loại tệp, kích thước và thời gian sửa đổi) của cả hai tệp giống hệt nhau thì các tệp được coi là bằng nhau.Mặt khác, các tệp được coi là khác nhau nếu kích thước hoặc nội dung của chúng khác nhau.
Lưu ý rằng không có chương trình bên ngoài nào được gọi từ chức năng này, mang lại cho nó tính di động và hiệu quả.
Hàm này sử dụng bộ đệm để so sánh trong quá khứ và kết quả, với các mục nhập bộ đệm sẽ bị vô hiệu nếu thông tin
os.stat()cho tệp thay đổi. Toàn bộ bộ đệm có thể bị xóa bằngclear_cache().
- filecmp.cmpfiles(dir1, dir2, common, shallow=True)¶
So sánh các tập tin trong hai thư mục dir1 và dir2 có tên do common đặt.
Trả về ba danh sách tên tệp: match, mismatch, errors. match chứa danh sách các tệp khớp, mismatch chứa tên của những tệp không khớp và errors liệt kê tên của các tệp không thể so sánh được. Các tệp được liệt kê trong errors nếu chúng không tồn tại trong một trong các thư mục, người dùng không có quyền đọc chúng hoặc nếu việc so sánh không thể thực hiện được vì một số lý do khác.
Tham số shallow có cùng ý nghĩa và giá trị mặc định như đối với
filecmp.cmp().Ví dụ:
cmpfiles('a', 'b', ['c', 'd/e'])sẽ so sánha/cvớib/cvàa/d/evớib/d/e.'c'và'd/e'mỗi cái sẽ nằm trong một trong ba danh sách được trả về.
- filecmp.clear_cache()¶
Xóa bộ đệm filecmp. Điều này có thể hữu ích nếu một tệp được so sánh quá nhanh sau khi được sửa đổi đến mức nó nằm trong độ phân giải mtime của hệ thống tệp cơ bản.
Added in version 3.4.
Lớp dircmp¶
- class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)¶
Xây dựng một đối tượng so sánh thư mục mới, để so sánh các thư mục a và b. ignore là danh sách các tên cần bỏ qua và mặc định là
filecmp.DEFAULT_IGNORES. hide là danh sách các tên cần ẩn và mặc định là[os.curdir, os.pardir].Lớp
dircmpso sánh các tệp bằng cách thực hiện so sánh shallow như được mô tả chofilecmp.cmp()theo mặc định bằng cách sử dụng tham số shallow.Thay đổi trong phiên bản 3.13: Đã thêm tham số shallow.
Lớp
dircmpcung cấp các phương thức sau:- report()¶
In (đến
sys.stdout) so sánh giữa a và b.
- report_partial_closure()¶
In bản so sánh giữa a và b và các thư mục con trực tiếp phổ biến.
- report_full_closure()¶
In so sánh giữa a và b và các thư mục con phổ biến (đệ quy).
Lớp
dircmpcung cấp một số thuộc tính thú vị có thể được sử dụng để lấy nhiều thông tin khác nhau về cây thư mục được so sánh.Lưu ý rằng thông qua móc
__getattr__(), tất cả các thuộc tính đều được tính toán một cách lười biếng, do đó sẽ không bị phạt tốc độ nếu chỉ sử dụng những thuộc tính nhẹ để tính toán.- left¶
Thư mục a.
- right¶
Thư mục b.
- left_list¶
Các tệp và thư mục con trong a, được lọc theo hide và ignore.
- right_list¶
Các tệp và thư mục con trong b, được lọc theo hide và ignore.
- common¶
Các tệp và thư mục con trong cả a và b.
- left_only¶
Các tập tin và thư mục con chỉ có trong a.
- right_only¶
Các tập tin và thư mục con chỉ có trong b.
- common_dirs¶
Thư mục con trong cả a và b.
- common_files¶
Các tập tin ở cả a và b.
- same_files¶
Các tệp giống hệt nhau ở cả a và b, sử dụng toán tử so sánh tệp của lớp.
- diff_files¶
Các tệp nằm trong cả a và b, có nội dung khác nhau tùy theo toán tử so sánh tệp của lớp.
- funny_files¶
Các tệp ở cả a và b nhưng không thể so sánh được.
- subdirs¶
Từ điển ánh xạ tên trong các phiên bản
common_dirsđếndircmp(hoặc phiên bản MyDirCmp nếu phiên bản này thuộc loại MyDirCmp, một lớp con củadircmp).Thay đổi trong phiên bản 3.10: Các mục trước đây luôn là phiên bản
dircmp. Bây giờ các mục có cùng loại với self, nếu self là lớp con củadircmp.
- filecmp.DEFAULT_IGNORES¶
Added in version 3.4.
Danh sách các thư mục bị
dircmpbỏ qua theo mặc định.
Dưới đây là ví dụ đơn giản về cách sử dụng thuộc tính subdirs để tìm kiếm đệ quy thông qua hai thư mục nhằm hiển thị các tệp phổ biến khác nhau:
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
... for name in dcmp.diff_files:
... print("diff_file %s found in %s and %s" % (name, dcmp.left,
... dcmp.right))
... for sub_dcmp in dcmp.subdirs.values():
... print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)