Organizing files in python – part 3

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

os.path.join()

دو یا چند آدرس را هوشمندانه به هم می چسباند و تبدیل به یک آدرس می کند.

1234path = os.path.join(os.environ['HOME'], 'Downloads', 'python')
print(path)

/home/milad/Downloads/python

os.path.abspath()

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

123os.path.abspath('.')

'/home/milad/Downloads/python'
123os.path.abspath('python.png')

'/home/milad/python.png'
123os.path.abspath('directory')

'/home/milad/directory'

os.path.basename()

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

12345path = '/home/linusek/Downloads/python'
dir_name = os.path.basename(path)
print(dir_name)

'python'

os.path.splitext()

اگر نام یک فایل را به این متد بدهیم نام فایل و فرمت آن را از هم جدا می کند.

1234file_name, file_format = os.path.splitext('python.png')
print(f'file name : {file_name} , file format : {file_format}')

file name : python , file format : .png

همچنین می توان به صورت مستقیم به نام فایل یا فرمت آن دسترسی داشت به صورت زیر:

123 os.path.splitext('python.png')[0]
 
 'python'

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

1234file_name, file_format = os.path.splitext('/home/milad/python.png')
print(f'file name : {file_name} , file format : {file_format}')

file name : /home/milad/python , file format : .png

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

1234file_name, file_format = os.path.splitext(os.path.basename('/home/linusek/python.png'))
print(f'file name : {file_name} , file format : {file_format}')

file name : python , file format : .png

os.stat()

اطلاعاتی در رابطه با فایل و دایرکتوری می دهد که به شرح زیر می باشد:

st_mode = protection bits

st_ino = inode number

st_device = device

st_nlink = تعداد هاردلینک

st_uid = یوزر آی دی مالک فایل یا دایرکتوری

st_gid = یوزر گروه مالک فایل یا دایرکتوری

st_size = سایز به بایت را نشان داده

st_atime = آخرین زمان دسترسی

st_mtime = آخرین زمان دستکاری

st_ctime = آخرین زمان تغییر متادیتا

123os.stat('python.png')

os.stat_result(st_mode=33188, st_ino=42468021, st_dev=2056, st_nlink=1, st_uid=1000, st_gid=985, st_size=202169, st_atime=1554684569, st_mtime=1554597604, st_ctime=1554597604)

اگر فقط مشخصه خاصی را می خواهید می توانید به صورت زیر عمل کنید:

123os.stat('directory').st_size

4096

os.path.getmtime()

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

123os.path.getmtime('python.png')

1554597604.1962452

همان گونه که می بینید زمان به نمایش درآمده خوانا نبوده، برای خوانایی بهتر می توان به صورت زیر عمل نمود:

12345from datetime import datetime
mode_time = datetime.fromtimestamp(os.path.getmtime('python.png'))
print(mode_time)

2019-04-07 00:40:04.196245

os.system()

می توان دستورات ترمینال را در این متد اجرا نمود.

برای شما
123os.system('ls -ltrh python.png')

-rw-r--r-- 1 linusek users 198K Apr  7 00:40 python.png

glob.glob()

متد glob موجود در glob لیست فایل ها و دایرکتوری ها را نشان می دهد. تفاوت این متد با os.listdir در این است که ما می توانیم در این متد از WildCardها استفاده بکنیم.

1234import glob
glob.glob(''/home/milad/programming/[pP]*')

['python', 'Perl', 'python unit test']

در خط دوم گفتیم برو در مسیر home/milad/programming دنبال فایل یا دایرکتوری هایی بگرد که نام اولشان با حرف p بزرگ یا کوچک شروع شده باشد.

os.remove()

این متد برای حذف فایل می باشد. در صورت اقدام به حذف دایرکتوری با این متد استثنا رخ می دهد.

1os.remove('python.png')

در استفاده از این متد محتاط باشید زیرا در صورت اشتباه فایل دیگری را اقدام به حذف خواهید کرد!

12345os.remove('course')

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
IsADirectoryError: [Errno 21] Is a directory: 'course'

همانطور که می بینید این متد قادر به حذف دایرکتوری نمی باشد.

os.removedirs()

اقدام به حذف دایرکتوری ها به صورت بازگشتی می کند. مثلا اگر داشته باشیم foo/dir1/dir2 ابتدا dir2 را حذف می کند سپس dir1 حذف می کند و در آخر foo را حذف می کند. فقط توجه فرمایید تمامی دایرکتوری ها باید فاقد فایل باشند تا بتوان آن ها را حذف نمود.

1os.removedirs('foo/dir1/dir2')

os.rmdir()

برای حذف دایرکتوری های خالی می باشد.

1os.rmdir('music')

shutil.rmtree()

برای حذف دایرکتوری هایی می باشد که دارای محتویات بوده.

1shutil.rmtree('/home/milad/books')

در کد بالا دایرکتوری books را که دارای محتویات بوده است را حذف کردیم.

subprocess.call()

می توان با استفاده از این متد دستورات قابل اجرا در ترمینال را اجرا کرد. این متد روش بهتر و پیشنهاد شده ای نسبت به os.system می باشد.

1234import subprocess
subprocess.call('ls -ltrh python.png', shell=True)

-rw-r--r-- 1 linusek users 198K Apr  7 00:40 python.png

subprocess.check_ouput()

همانند متد قبلی بوده با این تفاوت که می توان خروجی دستور اجرا شده را در متغییر ذخیره کرد.

12345import subprocess
output = subprocess.check_output('ls -ltrh python.png'', shell=True)
print(output)

-rw-r--r-- 1 linusek users 198K Apr  7 00:40 python.png

os.startfile()

متاسفانه این متد فقط در ویندوز قابل استفاده بوده (حداقل تا نسخه ۳.۷.۲ اینجوری هستش)، اما به هر حال اگر شما به این متد مسیر یک فایل را بدهید آن فایل با برنامه پیش فرض انتخاب شده شروع به اجرا می کند.

1os.startfile('C:\pirahan_sorati.mp3')

در مثال بالا فایل pirahan_sorati.mp3 مثلا با برنامه vlc که به عنوان برنامه پیش فرض برای پخش فایل های صوتی از سمت کاربر انتخاب شده است پخش می شود. شما می توانید در تنظیمات مشخص کنید که هر فایل با چه برنامه ای اجرا بشود. (شاید بشینم همچین قابلیتی برای گنو هم اضافه بکنم 🙂 )

shutil.copy()

متد copy در ماژول shutil برای کپی کردن فایل ها می باشد. ابتدا نام فایلی که قرار است کپی شود را نوشته و سپس مقصد آن را. در صورت موفقیت آمیز بودن عمل کپی، مقدار بازگشتی آن آدرس مقصد و نام فایلی است که کپی شده است. زمانی که یک فایل را کپی می کنید زمان دسترسی و آخرین زمان دستکاری آن هم به روز می شود.

123shutil.copy('python.png', '/home/milad/pictures/python-pic')

'/home/milad/pictures/python-pic/python.png'

شما قادر هستید تا نام فایلی که قرار است کپی شود را در مقصد با یک نام دیگر ذخیره کنید به صورت زیر:

123shutil.copy('python.png', '/home/milad/pictures/python-pic/new_python.png')

'/home/milad/pictures/python-pic/new_python.png'

در مثال بالا فایل python.png که قرار است کپی شود را در مقصد با نام new_python.png کپی کردیم. نکته ای که در مورد این متد وجود دارد اگر از نام فایلی که قرار است کپی شود در مقصد وجود داشته باشد عمل overwrite بر روی آن فایل انجام می شود، پس در کپی کردن فایل ها محتاط باشید تا تا بر اثر اشتباه محتویات یک فایل را پاک نکنید.

12345678files = os.listdir('/home/milad/Downloads')
for file in files:
    if file.endswith('pdf'):
        shutil.copy(file, '/home/milad/books')

'/home/milad/books/uml.pdf'
'/home/milad/books/avr.pdf'
'/home/milad/books/Git-pro.pdf'

در مثال بالا ابتدا لیست تمامی فایل های موجود در home/milad/Downloads را در متغییر files ذخیره کرده ایم. در حلقه از شرط استفاده کردیم و گفتیم اگر نام هر فایل موجود در این لیست با pdf تموم شده بود بیا این فایل ها را در مسیر home/milad/books کپی کن. به همین راحتی تونستیم کاری که حوصله سر بر و زمان بر بودش را با نوشتن یک اسکریپت در عرض چند ثانیه به راحتی کپی کنیم. پس این خلاقیت شماس که چجوری بتونید با استفاده از این چیزهایی که آموزش دادم کارهای دستی خودتونو به صورت اتوماتیک در بیارید یا مشکلات را حل کنید.

منتظر قسمت بعدی این آموزش باشید.

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

نویسنده مطلب: میلادقاسمی

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

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

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

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