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

سرور مجازی NVMe

Python: با خیال راحت دایرکتوری تودرتو ایجاد کنید

0 27
زمان لازم برای مطالعه: 4 دقیقه


معرفی

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

خطاهای احتمالی ممکن است به دلیل وجود نداشتن دایرکتوری والد یا به دلیل تغییر همزمان فایل‌ها در سیستم فایل توسط برنامه‌های دیگر و ایجاد چیزی که به نام شرایط مسابقه.

آ شرایط مسابقه (در این مورد به نام 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

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

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

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