برنامه نویسی ۳۶۶۱ بازدید

هر کسی می‌تواند برنامه‌های پایتون بنویسد تا با سیستم فایل تعامل داشته و کارهای جالبی با آن انجام دهد. با این حال روش انجام این کار همواره چندان روشن نیست. این مقاله به توسعه‌دهندگان مشتاق و همچنین دانشمندان داده اختصاص دارد. در ادامه 10 مورد از مهم‌ترین دستورهای کتابخانه‌های os و shutil را معرفی کرده‌ایم که با آن‌ها می‌توان اسکریپت‌هایی برای خودکار سازی تعامل با سیستم فایل نوشت. این متدها برای کار با فایل در پایتون ضروری هستند.

کار با فایل در پایتون

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

کار با فایل در پایتون

دایرکتوری‌ها مانند جعبه‌ها هستند که چیزهایی در خود جای داده‌اند که در این مورد یادداشت‌ها هستند.

کار با فایل در پایتون

دفترچه‌های یادداشت مانند فایل‌ها هستند. شما می‌توانید آن‌ها را بخوانید و بنویسید و می‌توانید آن‌ها را درون جعبه‌های دایرکتوری‌ها قرار دهید.

در این راهنما نگاهی به متدهایی از ماژول‌های os و shutil خواهیم داشت. ماژول os در واقع ماژول اصلی پایتون برای تعامل با سیستم عامل است. ماژول shutil نیز شامل عملیات سطح بالای فایل است. به دلایلی ما دایرکتوری‌ها را با os می‌سازیم؛ اما آن‌ها را با shutil کپی کرده یا منتقل می‌کنیم.

ماژول Pathlib

در پایتون نسخه 3.4 ماژول pathlib به کتابخانه استاندارد پایتون اضافه شده‌ است تا کار با مسیرهای فایل را بهبود بخشد و در نسخه 3.6 به خوبی با اجزای دیگر کتابخانه استاندارد، سازگار شده است. متدهای pathlib برخی مزیت‌ها برای تحلیل مسیرهای فایل نسبت به متدهایی که در ادامه بررسی کرده‌ایم دارند. برای مثال pathlib با مسیرها به عنوان شیء رفتار می‌کند و نه رشته. با این که pathlib سرراست است، اما همه کارکردهای سطح پایین مورد نیاز که بررسی خواهیم کرد را ندارد. ضمناً مطمئناً سال‌هاست که توسعه‌دهندگان، متدهای shutil و so معرفی شده در این مطلب را در کدها دیده‌اند و با آن‌ها به خوبی آشنا هستند. بنابراین قطعاً استفاده از متدهای آشنا ایده بهتری است.

و اما چند نکته دیگر که پیش از ادامه این مثال‌ها باید بدانید:

  • این راهنما برای پایتون نسخه 3 نوشته شده است. پایتون 2 از کمتر از یک سال دیگر، یعنی تاریخ 1 ژانویه 2020 دیگر پشتیبانی نخواهد شد.
  • شما باید فایل so و shutil خود را برای استفاده از این دستورها ایمپورت کنید.
  • کد مثال ما روی این مخزن گیت‌هاب (+) موجود است.
  • شما می‌توانید آرگومان‌های مورد نظر خود را به جای آرگومان‌هایی که در گیومه‌های زیر ارائه شده‌اند جایگزین کنید.

اینک که با چارچوب قضیه آشنا شدیم، نوبت آن رسیده است که وارد بحث شویم. پس با ما همراه باشید تا با 10 مورد از مهم‌ترین دستورهای کار با سیستم فایل در پایتون آشنا شوید.

10 متد سیستم فایل

فهرستی که در ادامه ارائه شده است از قالب زیر پیروی می‌کند:

نام متد– توضیح متد – دستورهای shell معادل برای سیستم macOS

دریافت اطلاعات

  • ()os.getcwd – مسیر دایرکتوری کاری جاری را به صورت رشته بازگشت می‌دهد – (معادل آن در مک pwd است).
  • ()os.listdir  – محتوای دایرکتوری کاری جاری را به صورت لیستی از رشته‌ها بازگشت می‌دهد – (معادل آن در مک ls است).
  • (“os.walk(“starting_directory_path – یک generator بازگشت می‌دهد که نام و اطلاعات مسیر را برای دایرکتوری‌ها و فایل‌های موجود در دایرکتوری جاری و همه زیردایرکتوری‌های آن را شامل می‌شود. این دستور معادل دقیقی در سیستم مک ندارد؛ اما ls –R نام زیردایرکتوری‌ها و نام‌های فایل‌های درون زیردایرکتوری‌ها را بازگشت می‌دهد.

تغییر شیءها

  • (“os.chdir(“/absolute/or/relative/path – تغییر دایرکتوری کاری جاری – (cd).
  • ()os.path.join – ایجاد یک مسیر برای استفاده‌های بعدی – (معادل CLI کوتاهی ندارد).
  • (“os.makedirs(“dir1/dir2 – ایجاد دایرکتوری – (mkdir -p).
  • (“shutil.copy2(“source_file_path”, “destination_directory_path – کپی کردن یک فایل یا دایرکتوری – (cp).
  • (“shutil.move(“source_file_path”, “destination_directory_path – انتقال یک فایل یا دایرکتوری – (mv).
  • (“os.remove(“my_file_path – حذف یک فایل – (rm).
  • (“shutil.rmtree(“my_directory_path – حذف یک دایرکتوری و همه فایل‌ها و دایرکتوری‌های درون آن – (rm -rf).

در ادامه به توضیح این دستورها می‌پردازیم.

دستورهای مربوط به دریافت اطلاعات فایل

در این بخش دستورات مرتبط با فایل و دایرکتوری توضیح داده شده‌اند.

()os.getcwd

این دستور دایرکتوری کاری جاری را به صورت یک رشته بازگشت می‌دهد. این دستور کاملاً سرراست است.

()os.listdir

این دستور محتوای دایرکتوری کاری جاری را به صورت لیستی از رشته‌ها بازگشت می‌دهد. این دستور نیز سرراست است.

(“os.walk(“my_start_directory

()os.walk یک generator ایجاد می‌کند که اطلاعاتی را در مورد دایرکتوری جاری و زیردایرکتوری‌های آن بازگشت می‌دهد. این دستور روی دایرکتوری‌ها در دایرکتوری آغازین مشخص عمل می‌کند.

()os.walk آیتم‌های زیر را برای هر دایرکتوری که مورد پیمایش قرار می‌دهد بازگشت خواهد داد:

  1. مسیر دایرکتوری جاری به صورت یک رشته.
  2. نام زیردایرکتوری‌ها در دایرکتوری جاری به صورت لیستی از رشته‌ها.
  3. نام فایل‌ها در دایرکتوری جاری به صورت لیستی از رشته‌ها.

این دستور کارهای فوق را برای همه دایرکتوری‌ها انجام می‌دهد.

در اغلب موارد استفاده از ()os.walk به همراه یک حلقه for برای تکرار روی محتوای یک دایرکتوری و زیردایرکتوری‌های آن مفید است. برای نمونه کد زیر همه فایل‌ها، دایرکتوری‌ها و زیردایرکتورها برای دایرکتوری کاری جاری را بازگشت می‌دهد.

import os
cwd = os.getcwd()
for dir_path, dir_names, file_names in os.walk(cwd):
    for f in file_names:
        print(f)

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

کار با فایل در پایتون

دستورهای ایجاد تغییر

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

(“os.chdir(“/absolute/or/relative/path

این متد دایرکتوری کاری جاری را به یک مسیر مطلق یا نسبی ارائه شده تغییر می‌دهد. اگر کد شما در ادامه تغییراتی روی سیستم فایل ایجاد می‌کند، بهتر است هرگونه استثنایی که در این متد رخ می‌دهد را به وسیله try-except مدیریت کنیم. در غیر این صورت ممکن است منجر به حذف شدن دایرکتوری یا فایل‌هایی شود که قصد حذف آن‌ها را ندارید.

()os.path.join

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

()os.path.join برای ایجاد یک مسیر طراحی شده است که با الحاق چندین رشته در یک مسیر فایل، روی اغلب سیستم‌های عامل کار می‌کند. توضیح آن در مستندات چنین است:

این دستور یک یا چند مؤلفه مسیر را به روشی هوشمندانه با هم ترکیب می‌کند. مقدار بازگشتی رشته الحاق یافته مسیر است و هر عضو *paths دقیقاً یک جداساز دایرکتوری (os.sep) پس از هر بخش غیر خالی، به جز مورد آخر دارد.

بدین ترتیب اگر شما روی یک سیستم macOS یا Unix کار می‌کنید، متد ()os.path.join به دنبال یک کاراکتر اسلش (/) آغازین برای هر رشته که برای ایجاد مسیر ارائه کرده‌اید، می‌گردد. اما اگر سیستم عامل به یک \ نیاز داشته باشد، در این صورت join می‌داند که باید از بک‌اسلش (\) استفاده کند.

()os.path.join همچنین اطلاعات روشنی به توسعه‌دهندگان دیگر ارائه می‌کند که شما در حال ایجاد یک مسیر هستید. مطمئناً استفاده از آن به جای الحاق معمولی رشته برای اجتناب از ایجاد موارد نادرست کاملاً مفید است.

(“os.makedirs(“dir1/dir2

()os.makedirs برای ایجاد دایرکتوری‌ها استفاده می‌شود. متد ()makedir نیز برای ایجاد دایرکتوری‌ها استفاده می‌شود؛ اما بی‌درنگ اقدام به ایجاد دایرکتوری نمی‌کند. بنابراین پیشنهاد می‌کنیم که از ()os.makedirs استفاده کنید.

(“shutil.copy2(“source_file”, “destination

در پایتون روش‌های زیادی برای کپی کردن فایل‌ها و دایرکتوری‌ها وجود دارد. ()shutil.copy2 یک انتخاب خوب است زیرا این متد تا حد امکان فراداده فایل اصلی را نیز در طی کپی شدن حفظ کند.

کار با فایل در پایتون
جابجایی اشیا

(“shutil.move(“source_file”, “destination

()shutil.move برای تغییر مکان فایل استفاده می‌شود. این متد به صورت پیش‌فرض و در پس‌زمینه از متد copy2 بهره می‌گیرد.

(“os.remove(“my_file_path

برخی اوقات لازم است که یک فایل را حذف کنید. ()os.remove به این منظور متد مناسبی است.

(“shutil.rmtree(“my_directory_path

()shutil.rmtree یک دایرکتوری و همه فایل‌ها و دایرکتوری‌های درون آن را حذف می‌کند.

کار با فایل در پایتون
حذف اشیا

بدیهی است که هنگام استفاده از تابع‌هایی که اقدام به حذف فایل‌ها یا دایرکتوری‌ها می‌کنند، باید هوشیار باشید. برای مثال بهتر است قبل از حذف کردن فایل‌ها، آن‌ها را با استفاده از متد ()print به صورت یک لیست نمایش دهید. بدین ترتیب پس از بررسی این لیست و مطمئن شدن از این که چیز نادرستی را حذف نمی‌کنید می‌توانید اقدام به حذف فایل‌ها بکنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.