از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون: بررسی کنید که آیا یک فایل یا دایرکتوری وجود دارد یا خیر
سرفصلهای مطلب
راه های زیادی برای حل یک مشکل در برنامه نویسی وجود دارد و این امر به ویژه در پایتون صادق است. بسیاری از اوقات متوجه خواهید شد که چندین ماژول داخلی یا استاندارد اساساً هدف یکسانی دارند، اما با عملکردهای کمی متفاوت. بررسی وجود فایل یا دایرکتوری با استفاده از پایتون قطعا یکی از این موارد است.
در اینجا چند راه برای بررسی فایل ها/دایرکتوری های موجود و تفاوت های ظریف آنها وجود دارد. در طول این مثال ها ما فرض می کنیم فهرست کار فعلی این فایل ها و دایرکتوری ها را در خود دارد:
drwxr-xr-x 3 scott staff 102 Jan 12 10:01 dir
-rw-r--r-- 1 scott staff 5 Jan 12 09:56 file.txt
lrwxr-xr-x 1 scott staff 8 Jan 12 09:56 link.txt -> file.txt
lrwxr-xr-x 1 scott staff 3 Jan 12 10:00 sym -> dir
توجه داشته باشید که ما یک دایرکتوری داریم (dir
)، یک فایل (file.txt
)، پیوند نمادین یک فایل (link.txt
، و یک پیوند نمادین دایرکتوری (sym
).
بررسی وجود فایل
این بدون شک ساده ترین راه برای بررسی وجود هر دو فایل است و اگر فایل باشد
import os
os.path.isfile('./file.txt')
os.path.isfile('./link.txt')
os.path.isfile('./fake.txt')
os.path.isfile('./dir')
os.path.isfile('./sym')
os.path.isfile('./foo')
توجه داشته باشید که os.path.isfile
میکند پیوندهای نمادین را دنبال کنید، بنابراین دریافت می کنیم True
هنگام بررسی link.txt
.
isfile
در واقع فقط یک روش کمکی است که در داخل از آن استفاده می کند os.stat
و stat.S_ISREG(mode)
در زیر، که ما آن را لمس می کنیم روی بعد.
بررسی وجود دایرکتوری
مانند isfile
روش، os.path.isdir
ساده ترین راه برای بررسی اینکه آیا یک دایرکتوری وجود دارد یا اینکه آیا مسیر داده شده یک دایرکتوری است، است.
import os
os.path.isdir('./file.txt')
os.path.isdir('./link.txt')
os.path.isdir('./fake.txt')
os.path.isdir('./dir')
os.path.isdir('./sym')
os.path.isdir('./foo')
باز هم درست مثل isfile
، os.path.isdir
پیوندهای نمادین را دنبال می کند. همچنین فقط یک بسته بندی ساده در اطراف است os.stat
و stat.S_ISDIR(mode)
، بنابراین شما چیزی بیش از راحتی از آن دریافت نمی کنید.
بررسی اینکه آیا وجود دارد یا خیر
راه دیگر برای بررسی وجود یک مسیر (تا زمانی که برایتان مهم نباشد که آیا مسیر به یک فایل یا دایرکتوری اشاره دارد) استفاده از آن است. os.path.exists
.
import os
os.path.exists('./file.txt')
os.path.exists('./link.txt')
os.path.exists('./fake.txt')
os.path.exists('./dir')
os.path.exists('./sym')
os.path.exists('./foo')
همانطور که می بینید، اهمیتی ندارد که مسیر به یک فایل، دایرکتوری یا پیوند نمادین اشاره می کند، بنابراین تقریباً مانند این است که شما از آن استفاده می کنید. isfile(path) or isdir(path)
. اما در واقع، در داخل فقط در تلاش برای تماس است os.stat(path)
، و اگر خطایی ایجاد شود، برمی گردد False
.
پیشرفته
در طول مقاله من به روش استفاده از تمام روش های بالا اشاره کرده ام os.stat
روش، بنابراین من فکر کردم مفید است که به آن نگاهی بیندازیم. این یک روش سطح پایین تر است که اطلاعات دقیقی در مورد فایل ها، دایرکتوری ها، سوکت ها، بافرها و موارد دیگر در اختیار شما قرار می دهد.
مانند تمام روش های دیگری که قبلاً پوشش داده ایم، os.stat
پیوندهای نمادین را دنبال می کند، بنابراین اگر می خواهید اطلاعات آماری را دریافت کنید روی یک لینک، سعی کنید استفاده کنید os.lstat()
بجای.
از آنجایی که هر سیستم عامل متفاوت است، داده های ارائه شده توسط os.stat
بسیار متفاوت است. در اینجا فقط برخی از داده های مشترک هر سیستم عامل آورده شده است:
st_mode
: بیت های حفاظتیst_uid
: شناسه کاربری مالکst_gid
: شناسه گروه مالکst_size
: اندازه فایل بر حسب بایتst_atime
: زمان آخرین دسترسیst_mtime
: زمان آخرین اصلاحst_ctime
: زمان آخرین تغییر ابرداده روی یونیکس یا زمان خلقت روی پنجره ها
سپس می توانید از این داده ها با استفاده از stat
ماژول برای دریافت اطلاعات جالب، مانند اینکه آیا یک مسیر به یک سوکت اشاره می کند (stat.S_ISSOCK(mode)
، یا اگر یک فایل در واقع یک لوله با نام باشد (stat.S_ISFIFO(mode)
).
اگر به عملکردهای پیشرفته تری نیاز دارید، این جایی است که باید بروید. اما در 90 درصد مواقع با دایرکتوری ها و فایل ها سر و کار دارید os
یا os.path
ماژول ها باید شما را تحت پوشش قرار دهند.
اگرچه، یک مورد استفاده معتبر ممکن است زمانی باشد که در حال انجام چندین آزمایش هستید روی همان فایل و می خواهید برای جلوگیری از سربار از تماس سیستم آماری برای هر آزمون بنابراین اگر چند آزمایش برای انجام دادن دارید، این به شما کمک میکند آن را با کارایی بیشتری انجام دهید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-30 08:48:25