از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
Python: با خیال راحت دایرکتوری تودرتو ایجاد کنید
سرفصلهای مطلب
معرفی
دستکاری فایل یکی از مهم ترین مهارت ها برای تسلط بر هر زبان برنامه نویسی است و انجام صحیح آن از اهمیت بالایی برخوردار است. انجام یک اشتباه می تواند باعث ایجاد مشکل در برنامه شما، برنامه های دیگر در حال اجرا شود روی همان سیستم و حتی خود سیستم.
خطاهای احتمالی ممکن است به دلیل وجود نداشتن دایرکتوری والد یا به دلیل تغییر همزمان فایلها در سیستم فایل توسط برنامههای دیگر و ایجاد چیزی که به نام شرایط مسابقه.
آ شرایط مسابقه (در این مورد به نام a مسابقه داده) زمانی اتفاق می افتد که دو یا چند برنامه بخواهند فایلی به همین نام در یک مکان ایجاد کنند. اگر این نوع باگ رخ دهد، یافتن و رفع آن بسیار سخت است، زیرا غیر قطعی است، یا به زبان ساده، بسته به موارد مختلفی ممکن است اتفاق بیفتد. روی زمان دقیق رقابت دو مسابقه برای داده ها.
در این مقاله روش ایجاد یک زیرشاخه در پایتون را به صورت ایمن و مرحله به مرحله خواهیم دید. همه چیز از این پس کار خواهد کرد روی مک، لینوکس و ویندوز.
ایجاد ایمن دایرکتوری تودرتو با pathlib
راه های زیادی برای ایجاد یک زیر شاخه وجود دارد، اما شاید ساده ترین آنها استفاده از آن باشد pathlib
مدول. این pathlib
ماژول در درجه اول برای کمک به انتزاع سیستم های فایل سیستم عامل مختلف و ارائه یک رابط یکنواخت برای کار با اکثر آنها ساخته شده است.
به لطف آن، کد شما باید مستقل از پلتفرم باشد. توجه داشته باشید که این فقط کار می کند روی نسخه های جدیدتر پایتون (3.5 و بالاتر).
فرض کنید یک مسیر مطلق از یک دایرکتوری داریم که به عنوان رشته به ما داده شده است، و می خواهیم یک زیر شاخه با نام مشخص ایجاد کنیم. بیایید یک دایرکتوری به نام ایجاد کنیم OuterDirectory
، و مکان InnerDirectory
درون آن.
خوب import Path
از pathlib
ماژول، ایجاد یک Path
با مسیر مورد نظر برای فایل جدید خود شیء کنید و از آن استفاده کنید mkdir()
روشی که دارای امضای زیر است:
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
قطعه کد زیر همان کاری را انجام می دهد که در بالا توضیح دادیم:
from pathlib import Path
path = Path("/home/kristina/OuterDirectory/InnerDirectory")
path.mkdir()
اگر mkdir()
موفق نمی شود، هیچ دایرکتوری ساخته نمی شود و خطایی ایجاد می شود.
mkdir() گزینه ها و خطاها
اگر کد را بدون ایجاد کد اجرا کنید OuterDirectory
، خطای زیر را مشاهده خواهید کرد:
Traceback (most recent call last):
File "makesubdir.py", line 3, in <module>
path.mkdir()
File "/home/kristina/anaconda3/lib/python3.7/pathlib.py", line 1230, in mkdir
self._accessor.mkdir(self, mode)
FileNotFoundError: (Errno 2) No such file or directory: '/home/kristina/OuterDirectory/InnerDirectory'
یا اگر InnerDirectory
درحال حاضر وجود دارد:
Traceback (most recent call last):
File "/home/kristina/Desktop/UNM/makesubdir.py", line 3, in <module>
path.mkdir()
File "/home/kristina/anaconda3/lib/python3.7/pathlib.py", line 1230, in mkdir
self._accessor.mkdir(self, mode)
FileExistsError: (Errno 17) File exists: '/home/kristina/OuterDirectory/InnerDirectory'
اگر دایرکتوری از قبل وجود داشته باشد، خطای افزایش یافته خواهد بود FileExistsError
و اگر والد وجود نداشته باشد، FileNotFoundError
مطرح خواهد شد.
از آنجایی که نمیخواهیم برنامهمان هر زمان که با خطای زیر مواجه شد خراب شود، این کد را در یک بلوک آزمایش قرار میدهیم:
from pathlib import Path
path = Path("/home/kristina/OuterDirectory/InnerDir")
try:
path.mkdir()
except OSError:
print("Failed to make nested directory")
else:
print("Nested directory made")
هنگام اجرا، اگر دایرکتوری با موفقیت ساخته شود، خروجی به صورت زیر خواهد بود:
Nested directory made
اگر با خطا مواجه شویم، خروجی زیر نمایش داده می شود:
Failed to make a nested directory
این mkdir()
روش سه پارامتر می گیرد: mode
، parents
، و exit_ok
.
- این
mode
پارامتر، اگر داده شود، باumask
نشان می دهد که کدام کاربران دارای امتیاز خواندن، نوشتن و اجرا هستند. بهطور پیشفرض، همه کاربران همه امتیازات را دارند که اگر امنیت مشکلی باشد ممکن است آن چیزی نباشد که ما میخواهیم. بیشتر لمس خواهیم کرد روی این بعدا parents
نشان می دهد، در مواردی که دایرکتوری والد وجود ندارد، باید روش:
1. خود دایرکتوری والد گم شده را ایجاد کنید (true
)
2. یا برای ایجاد خطا، مانند مثال دوم ما (false
)exist_ok
مشخص می کند که اگرFileExistsError
اگر دایرکتوری با همین نام از قبل وجود داشته باشد، باید افزایش یابد. توجه داشته باشید که اگر فایلی به همین نام دایرکتوری نباشد، این خطا همچنان مطرح می شود.
تخصیص امتیازات دسترسی
بیایید یک دایرکتوری به نام بسازیم SecondInnerDirectory
که در آن فقط مالک تمام امتیازات خواندن، نوشتن و اجرا را در داخل ناموجود دارد SecondOuterDirectory
:
from pathlib import Path
path = Path("/home/kristina/SecondOuterDirectory/SecondInnerDirectory")
path.mkdir(mode = 0o007, parents= True, exist_ok= True)
این باید بدون خطا اجرا شود. اگر به سمت SecondOuterDirectory
و محتویات آن را از قسمت بررسی کنید console مانند:
$ ls -al
باید خروجی بگیریم:
total 12
drwxrwxr-x 3 kristina kristina 4096 dec 10 01:26 .
drwxr-xr-x 77 kristina kristina 4096 dec 10 01:26 ..
d------r-x 2 kristina kristina 4096 dec 10 01:26 SecondInnerDirectory
بسیار خوب، بنابراین می توانیم ببینیم که دایرکتوری والد با موفقیت ساخته شده است، اما امتیازات آنطور که انتظار می رود نیست. مالک فاقد امتیاز نوشتن است.
مسئله ای که ما اینجا داریم این است umask
به ما اجازه نمی دهد امتیازات مورد نظر را ایجاد کنیم. برای دور زدن این موضوع، پس انداز می کنیم umask
مقدار اصلی را موقتاً تغییر دهید و در نهایت با استفاده از عبارت به مقدار اولیه برگردانید umask()
روش از ماژول سیستم عامل umask()
مقدار قدیمی را برمی گرداند umask
.
بیایید کد خود را بازنویسی کنیم تا این را آزمایش کنیم:
from pathlib import Path
import os
old_mask = os.umask(0)
path = Path("/home/kristina/SecondOuterDirectory/SecondInnerDirectory")
path.mkdir(mode = 0o007, parents= True, exist_ok= True)
os.umask(old_mask)
اجرای این کد و استفاده از ls -al
دستور دوباره به خروجی زیر منجر می شود:
total 12
drwxrwxrwx 3 kristina kristina 4096 dec 10 01:45 .
drwxr-xr-x 77 kristina kristina 4096 dec 10 01:45 ..
d------rwx 2 kristina kristina 4096 dec 10 01:45 SecondInnerDirectory
نتیجه
به منظور دستکاری ایمن فایل ها روی بسیاری از سیستمهای مختلف، ما به روشی قوی برای رسیدگی به خطاهایی مانند مسابقه دادهها نیاز داریم. پایتون از طریق pathlib
مدول.
هنگام کار با فایل سیستمها، خطاها همیشه میتوانند رخ دهند، و بهترین راه برای مقابله با آن، تنظیم دقیق سیستمها برای شناسایی همه خطاهایی است که به طور بالقوه میتوانند برنامه ما را خراب کنند یا مشکلات دیگری ایجاد کنند. نوشتن کد تمیز باعث ایجاد برنامه های بادوام می شود.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-13 09:37:04