وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

پایتون: بررسی کنید که آیا فایل یا دایرکتوری خالی است یا خیر

0 11
زمان لازم برای مطالعه: 5 دقیقه


معرفی

پایتون مجموعه ای از اشیا و توابع کتابخانه ای داخلی دارد که به ما در انجام این کار کمک می کند. در این آموزش، روش بررسی خالی بودن فایل یا دایرکتوری در پایتون را یاد خواهیم گرفت.

تمایز بین یک فایل و یک فهرست

وقتی می خواهیم بررسی کنیم که آیا یک مسیر خالی است یا نه، ما می خواهیم بدانیم که آیا یک است فایل یا فهرست راهنما زیرا این روی رویکردی که می خواهیم استفاده کنیم تأثیر می گذارد.

فرض کنید ما دو متغیر مکان نگهدار داریم dirpath و filepath شناسایی یک فهرست و فایل محلی:

dirpath = '/mnt/f/code.books/articles/python'
filepath = '/mnt/f/code.books/articles/python/code/file_dir.py'

استفاده کردن مسیر os

پایتون فراهم می کند os ماژول که یک بسته استاندارد پایتون از توابع، اشیاء و ثابت ها برای کار با سیستم عامل است.

os.path را در اختیار ما قرار می دهد isfile() و isdir() توابع برای تشخیص آسان بین فایل و دایرکتوری:

import os

dirpath = '/mnt/f/code.books/articles/python'
filepath = '/mnt/f/code.books/articles/python/code/file_dir.py'

os.path.isfile(dirpath) 
os.path.isdir(dirpath) 
os.path.isfile(filepath) 
os.path.isdir(filepath) 

هر دوی این توابع a را برمی‌گردانند Boolean ارزش.

استفاده کردن pathlib

پایتون 3.4 را معرفی کرد pathlib ماژول، که یک رابط شی گرا برای کار با فایل سیستم ها فراهم می کند.

pathlib کار با فایل سیستم را در مقایسه با os یا os.path.

را Path کلاس از pathlib ماژول یک مسیر را به عنوان آرگومان خود می پذیرد و a را برمی گرداند Path شی، که به راحتی می توان با متدها و ویژگی ها پرس و جو کرد یا زنجیره زد:

from pathlib import Path

dirpath = '/mnt/f/code.books/articles/python'
filepath = '/mnt/f/code.books/articles/python/code/file_dir.py'

Path(dirpath).is_file() 
Path(dirpath).is_dir() 
Path(filepath).is_file() 
Path(dirpath).is_file() 

در اینجا، ما در حال بررسی هستیم که آیا Path در عوض شی یک فایل یا دایرکتوری است.

بررسی کنید که آیا یک فایل خالی است

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

می توان به سرعت یک فایل خالی ایجاد کرد روی لینوکس و MacOS:

$ touch emptyfile

یا روی پنجره ها:

$ type nul > emptyfile

حالا بیایید متغیرها را تعریف کنیم – emptyfile و nonemptyfile اشاره به یک فایل خالی با صفر بایت و یک فایل غیر خالی به اندازه یک بایت:

emptyfile = '/mnt/f/code.books/articles/python/emptyfile'
nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile'

بیایید نگاهی به نوع و اندازه این فایل ها بیندازیم:

$ ls -l
-rwxrwxrwx 1 root root   0 Sep 10 18:06 emptyfile
-rwxrwxrwx 1 root root   1 Sep 10 18:08 onebytefile
$ file emptyfile
emptyfile: empty
$ file onebytefile
onebytefile: very short file (no magic)

استفاده کردن os.stat

یا می توانیم از Python استفاده کنیم os ماژول برای بررسی این اطلاعات نیز. را os.stat() تابع a را برمی گرداند stat_result هدف – شی. این شی در اصل یک ساختار داده است که مجموعه ای از ویژگی های فایل است:

import os

emptyfile = '/mnt/f/code.books/articles/python/emptyfile'
nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile'

result = os.stat(nonemptyfile)
result.st_size 

result = os.stat(emptyfile)
result.st_size 

استفاده کردن مسیر os

پایتون os.path ماژول کار با مسیرهای فایل را بسیار آسان می کند. به غیر از بررسی وجود یک مسیر یا تشخیص نوع آنها، می‌توانیم اندازه یک فایل مشخص شده به عنوان رشته را نیز بازیابی کنیم.

پیشنهاد می‌کنیم بخوانید:  پیمایش لیست به ترتیب معکوس در پایتون

os.path.getsize() اندازه یک فایل مشخص شده را به صورت a برمی گرداند شیء مسیر مانند و استفاده از آن بسیار ساده تر از os.stat():

import os

emptyfile = '/mnt/f/code.books/articles/python/emptyfile'
nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile'

os.path.getsize(emptyfile) 

os.path.getsize(nonemptyfile) 

استفاده کردن pathlib

اگر کار می کنیم روی پایتون 3.4 یا بالاتر می توانیم از آن استفاده کنیم pathlib ماژول برای بازیابی اندازه یک فایل این اساسا جایگزین os مدول. Path.stat() را برمی گرداند stat_result دارایی a Path شی که معادل مقدار بازگشتی است os.stat():

from pathlib import Path

emptyfile = '/mnt/f/code.books/articles/python/emptyfile'
nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile'

print('File stats: ' + Path(emptyfile).stat())

print('File size: ' + Path(emptyfile).stat().st_size + ' byte(s)')

print('File stats: ' + Path(nonemptyfile).stat())

print('File size: ' + Path(nonemptyfile).stat().st_size + ' byte(s)')

این منجر به:

File stats: os.stat_result(st_mode=33279, st_ino=14355223812249048, st_dev=17, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1600087010, st_mtime=1600087010, st_ctime=1600087010)
File size: 0 byte(s)

File stats: os.stat_result(st_mode=33279, st_ino=5629499534218713, st_dev=17, st_nlink=1, st_uid=0, st_gid=0, st_size=1, st_atime=1600088120, st_mtime=1600088072, st_ctime=1600088072)
File size: 1 byte(s)

بررسی کنید که آیا دایرکتوری خالی است یا خیر

دایرکتوری که حاوی هیچ فایل یا زیرمجموعه دیگری نباشد یک دایرکتوری خالی است. با این حال، هر دایرکتوری (حتی دایرکتوری های خالی) حاوی 2 ورودی زیر است:

  • . (نقطه تلفظ می شود) به دایرکتوری فعلی اشاره می کند و در عملیاتی مانند یافتن چیزی در دایرکتوری فعلی مفید است
  • .. (دو نقطه تلفظ می شود) مرجع دایرکتوری والد دایرکتوری فعلی است، برای عقب نشینی از دایرکتوری فعلی لازم است

بیایید دو متغیر تعریف کنیم – emptydirectory و nonemptydirectory اشاره به یک دایرکتوری خالی و غیر خالی:

emptydirectory = '/mnt/f/code.books/articles/python/markdown'
nonemptydirectory = '/mnt/f/code.books/articles/python/code'

دایرکتوری خالی هیچ موردی در آن ندارد:

$ pwd
/mnt/f/code.books/articles/python/markdown
$ ls -la
total 0
drwxrwxrwx 1 root root 512 Sep 11 11:52 .
drwxrwxrwx 1 root root 512 Sep 10 20:22 ..

دایرکتوری غیر خالی یک فایل دارد:

$ pwd
/mnt/f/code.books/articles/python/code
$ ls -la
total 0
drwxrwxrwx 1 root root 512 Sep 14 11:02 .
drwxrwxrwx 1 root root 512 Sep 14 18:22 ..
-rwxrwxrwx 1 root root 425 Sep 14 12:27 file_dir.py

استفاده کردن os.listdir()

را os.listdir() دنباله ای را برمی گرداند که حاوی نام تمام موارد یافت شده در مسیر دایرکتوری است که به عنوان آرگومان ارسال شده است. شامل نمی شود . و .. ورودی های:

import os

os.listdir(emptydirectory) 
os.listdir(nonemptydirectory) 

محاسبه طول لیست برگشتی به راحتی مشخص می کند که آیا دایرکتوری خالی است یا خیر. طول یک فهرست خالی همیشه صفر است:

import os

print(len(os.listdir(nonemptydirectory))) 
print(len(os.listdir(emptydirectory))) 

استفاده کردن os.scandir()

را os.listdir() این عملکرد زمانی مفید است که به یک دسته کامل از نام ورودی ها به عنوان لیست برای پردازش بیشتر نیاز دارید. با این حال، برای بررسی اینکه آیا حداقل یک ورودی وجود دارد یا خیر، به لیستی از تمام فایل‌های داخل نیازی نداریم.

پیشنهاد می‌کنیم بخوانید:  پیشوند 'b' در زبان پایتون String Literals

اگر دایرکتوری بزرگ باشد، os.listdir() عملکرد زمان زیادی طول می کشد تا اجرا شود، در حالی که تا زمانی که بیش از آن وجود داشته باشد 0 ورودی ها، سوال ما پاسخ داده شده است.

تابعی که به کمک می آید این است os.scandir() که یک تکرار یا مولد تنبل را برمی گرداند.

ژنراتورها تکرارگرهایی را برمی‌گردانند که می‌توانند مانند تکرارهای معمولی مانند یک لیست حلقه شوند. اما بر خلاف یک لیست، مجموعه یا فرهنگ لغت، آنها یک دسته کامل از مقادیر را در حافظه ذخیره نمی کنند و در عوض یک مقدار جدید را برمی گردانند. روی درخواست.

این روش تقریباً 200 برابر سریعتر است روی دایرکتوری های 1000 فایل

بنابراین به جای حلقه زدن کل ساختار دایرکتوری، می توانیم استفاده کنیم os.scandir() برای بررسی اینکه آیا حداقل یک ورودی در مسیر دایرکتوری وجود دارد یا خیر:

import os

emptydirectory = '/mnt/f/code.books/articles/python/markdown'
nonemptydirectory = '/mnt/f/code.books/articles/python/code'

print(next(os.scandir(emptydirectory), None))
print(next(os.scandir(nonemptydirectory), None)) 

استفاده می کنیم next() که یک تابع داخلی برای بازیابی آیتم موجود بعدی از تکرار کننده تنبل توسط os.scandir(). از آنجا که emptydirectory هیچ موردی در دسترس ندارد – در حال بازگشت است None در حالی که برای nonemptydirectory در حال بازگشت است os.DirEntry هدف – شی.

استفاده کردن pathlib

یک رویکرد ترجیحی به os ماژول است pathlib مدول. استفاده خواهیم کرد pathlib.Path.iterdir()، که نه تنها ساده تر است بلکه استفاده از آن بسیار راحت تر است os.listdir() یا os.scandir().

این یک شی تکرار شونده یا مولد تنبل را بسیار شبیه به آن برمی گرداند os.scandir()، که روی فایل های موجود در مسیر دایرکتوری ارسال شده به عنوان آرگومان تکرار می شود:

from pathlib import Path
print(Path(emptydirectory).iterdir()) 

استفاده کردن next()، ما هستیم تلاش کردن برای واکشی مورد بعدی موجود با None به عنوان پیش فرض آیتم بازگشت، next() الف را مطرح نخواهد کرد StopIteration استثنا در مواردی که هیچ موردی در مجموعه وجود ندارد:

print(next(Path(emptydirectory).iterdir(), None)) 
print(next(Path(nonemptydirectory).iterdir(), None)) 

اکثر توابع داخلی پایتون با آن کار می کنند تکرار شونده، از جمله تابع any() که برمی گردد True اگر قابل تکرار حداقل یک عنصر دارد که می توان آن را ارزیابی کرد True:

from pathlib import Path
print(any(Path(emptydirectory).iterdir()) 
print(any(nonemptydirectory).iterdir()) 

نتیجه

در این آموزش روش تشخیص فایل ها و دایرکتوری ها را بررسی کرده ایم و پس از آن خالی بودن آنها را بررسی کرده ایم.

این را می توان از طریق انجام داد os یا pathlib ماژول ها و توابع و کلاس های راحتی آنها.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-16 10:12:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید