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)