از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون: بررسی کنید که آیا فایل یا دایرکتوری خالی است یا خیر
سرفصلهای مطلب
معرفی
پایتون مجموعه ای از اشیا و توابع کتابخانه ای داخلی دارد که به ما در انجام این کار کمک می کند. در این آموزش، روش بررسی خالی بودن فایل یا دایرکتوری در پایتون را یاد خواهیم گرفت.
تمایز بین یک فایل و یک فهرست
وقتی می خواهیم بررسی کنیم که آیا یک مسیر خالی است یا نه، ما می خواهیم بدانیم که آیا یک است فایل یا فهرست راهنما زیرا این روی رویکردی که می خواهیم استفاده کنیم تأثیر می گذارد.
فرض کنید ما دو متغیر مکان نگهدار داریم 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()
این عملکرد زمانی مفید است که به یک دسته کامل از نام ورودی ها به عنوان لیست برای پردازش بیشتر نیاز دارید. با این حال، برای بررسی اینکه آیا حداقل یک ورودی وجود دارد یا خیر، به لیستی از تمام فایلهای داخل نیازی نداریم.
اگر دایرکتوری بزرگ باشد، 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