filecmp --- مقایسه پرونده‌ها و پوشه‌ها

کد منبع: Lib/filecmp.py


ماژول filecmp توابعی برای مقایسه پرونده‌ها و پوشه‌ها تعریف می‌کند، با موازنه‌های اختیاری مختلف بین زمان و صحت. برای مقایسه پرونده‌ها، ماژول difflib را نیز ببینید.

ماژول filecmp توابع زیر را تعریف می‌کند:

filecmp.cmp(f1, f2, shallow=True)

پرونده‌هایی با نام‌های f1 و f2 را مقایسه می‌کند و اگر به نظر برابر باشند، True و در غیر این صورت False را برمی‌گرداند.

اگر shallow درست باشد و امضاهای os.stat() هر دو پرونده (نوع پرونده، اندازه و زمان اصلاح) یکسان باشند، پرونده‌ها برابر در نظر گرفته می‌شوند.

در غیر این صورت، اگر اندازه یا محتوای پرونده‌ها متفاوت باشد، آن‌ها متفاوت در نظر گرفته می‌شوند.

توجه داشته باشید که هیچ برنامه‌ی خارجی‌ای توسط این تابع فراخوانی نمی‌شود، که این امر باعث قابلیت حمل و کارایی آن می‌شود.

این تابع از یک نهانگاه برای مقایسه‌ها و نتایج گذشته استفاده می‌کند و چنانچه اطلاعات os.stat() مربوط به پرونده تغییر کند، ورودی‌های نهانگاه نامعتبر می‌شوند. می‌توان کل نهانگاه را با استفاده از clear_cache() پاک کرد.

filecmp.cmpfiles(a, b, common, shallow=True)

پرونده‌های موجود در دو پوشه‌ی a و b را که نام‌های آن‌ها توسط common داده شده است، مقایسه کنید.

سه فهرست از نام پرونده‌ها برمی‌گرداند: match، mismatch، errors. match شامل فهرست پرونده‌هایی است که مطابقت دارند، mismatch شامل نام آن‌هایی است که مطابقت ندارند، و errors نام پرونده‌هایی را فهرست می‌کند که مقایسه آن‌ها ممکن نبوده است. پرونده‌ها در errors فهرست می‌شوند اگر در یکی از پوشه‌ها وجود نداشته باشند، کاربر دسترسی لازم برای خواندن آن‌ها را نداشته باشد، یا مقایسه به دلیل دیگری امکان‌پذیر نباشد.

پارامتر shallow همان معنا و مقدار پیش‌فرضِ filecmp.cmp() را دارد.

برای مثال، cmpfiles('a', 'b', ['c', 'd/e']) a/c را با b/c و a/d/e را با b/d/e مقایسه می‌کند. 'c' و 'd/e' هرکدام در یکی از سه فهرست برگردانده‌شده قرار خواهند گرفت.

filecmp.clear_cache()

نهانگاه filecmp را پاک کنید. این ممکن است زمانی مفید باشد که پرونده‌ای آن‌قدر سریع پس از تغییرش مقایسه شود که در محدوده‌ی دقت mtime سامانه فایل‌بندی زیرین قرار گیرد.

اضافه شده در نسخه‌ی 3.4.

کلاس dircmp

class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)

یک شیء جدید مقایسه‌ی پوشه می‌سازد، تا پوشه‌های a و b را مقایسه کند. ignore فهرستی از نام‌ها برای نادیده‌گرفتن است و مقدار پیش‌فرض آن filecmp.DEFAULT_IGNORES است. hide فهرستی از نام‌ها برای پنهان‌کردن است و مقدار پیش‌فرض آن [os.curdir, os.pardir] است.

کلاس dircmp به‌طور پیش‌فرض با استفاده از پارامتر shallow، پرونده‌ها را با انجام مقایسه‌های سطحی (shallow) مقایسه می‌کند، همان‌گونه که برای filecmp.cmp() شرح داده شده است.

تغییر یافته در نسخه‌ی 3.13: پارامتر shallow اضافه شد.

کلاس dircmp متدهای زیر را ارائه می‌کند:

report()

مقایسه‌ای بین a و b را (در sys.stdout) چاپ کنید.

report_partial_closure()

مقایسه‌ای میان a و b و زیرپوشه‌های مستقیم مشترک را چاپ می‌کند.

report_full_closure()

مقایسه‌ای بین a و b و زیرپوشه‌های مشترک (به‌صورت بازگشتی) را چاپ می‌کند.

کلاس dircmp تعدادی ویژگی جالب ارائه می‌دهد که می‌توان از آن‌ها برای دریافت اطلاعات گوناگون درباره درخت‌های پوشه مقایسه‌شده استفاده کرد.

توجه داشته باشید که از طریق قلاب‌های __getattr__()، همه ویژگی‌ها به‌صورت تنبل محاسبه می‌شوند، بنابراین اگر فقط از ویژگی‌هایی استفاده شود که محاسبه‌شان کم‌هزینه است، هیچ هزینه‌ای از نظر سرعت وجود ندارد.

left

پوشه‌ی a.

right

پوشه‌ی b.

left_list

پرونده‌ها و زیرپوشه‌های درون a، که با hide و ignore فیلتر شده‌اند.

right_list

پرونده‌ها و زیرپوشه‌های موجود در b، پالایش‌شده بر اساس hide و ignore.

common

پرونده‌ها و زیرپوشه‌ها در هر دو a و b.

left_only

پرونده‌ها و زیرپوشه‌ها فقط در a.

right_only

پرونده‌ها و زیرپوشه‌هایی که فقط در b وجود دارند.

common_dirs

زیرپوشه‌های موجود در هر دو a و b.

common_files

پرونده‌های موجود در هر دو a و b.

common_funny

نام‌هایی که در هر دو a و b وجود دارند، به‌طوری که نوع آن‌ها بین پوشه‌ها متفاوت است، یا نام‌هایی که os.stat() برای آن‌ها خطا گزارش می‌دهد.

same_files

پرونده‌هایی که در هر دو a و b یکسان هستند، با استفاده از عملگر مقایسه‌ی فایلِ کلاس.

diff_files

پرونده‌هایی که در هر دو a و b وجود دارند و محتوای آن‌ها بر اساس عملگر مقایسه‌ی فایلِ کلاس متفاوت است.

funny_files

پرونده‌هایی که در هر دو a و b وجود دارند، اما قابل مقایسه نبودند.

subdirs

دیکشنری‌ای که نام‌های موجود در common_dirs را به نمونه‌های dircmp نگاشت می‌کند (یا به نمونه‌های MyDirCmp، در صورتی که این نمونه از نوع MyDirCmp، که یک کلاس فرعی از dircmp است، باشد).

تغییر یافته در نسخه‌ی 3.10: پیش‌تر، مدخل‌ها همیشه نمونه‌های dircmp بودند. اکنون مدخل‌ها همان نوع self هستند، اگر self زیرکلاسی از dircmp باشد.

filecmp.DEFAULT_IGNORES

اضافه شده در نسخه‌ی 3.4.

فهرست پوشه‌هایی که به‌طور پیش‌فرض توسط dircmp نادیده گرفته می‌شوند.

در اینجا یک مثال ساده‌شده از استفاده از ویژگی subdirs برای جستجوی بازگشتی در دو پوشه جهت نمایش پرونده‌های مشترک متفاوت آمده است:

>>> 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)