مدیر دیتابیس و مهندس داده
Organizing files in python - part 3
به قسمت سوم آموزش سازماندهی و کار با فایل ها و دایرکتوری ها در پایتون خوش آمدید . قسمت قبلی این آموزش را می توانید در اینجا بخوانید.
os.path.join()
دو یا چند آدرس را هوشمندانه به هم می چسباند و تبدیل به یک آدرس می کند.
path = os.path.join(os.environ['HOME'], 'Downloads', 'python')
print(path)
/home/milad/Downloads/python
os.path.abspath()
برای نشان دادن آدرس کامل جایی که هستیم می باشد. همچنین اگر نیاز داشتیم تا آدرس کامل یک فایل یا دایرکتوری را داشته باشیم می توانیم از این متد استفاده بکنیم.
os.path.abspath('.')
'/home/milad/Downloads/python'
os.path.abspath('python.png')
'/home/milad/python.png'
os.path.abspath('directory')
'/home/milad/directory'
os.path.basename()
زمانی که به این متد آدرس داده شود نام فایل یا دایرکتوری که در آخر آدرس باشد را بر می گرداند.
path = '/home/linusek/Downloads/python'
dir_name = os.path.basename(path)
print(dir_name)
'python'
os.path.splitext()
اگر نام یک فایل را به این متد بدهیم نام فایل و فرمت آن را از هم جدا می کند.
file_name, file_format = os.path.splitext('python.png')
print(f'file name : {file_name} , file format : {file_format}')
file name : python , file format : .png
همچنین می توان به صورت مستقیم به نام فایل یا فرمت آن دسترسی داشت به صورت زیر:
os.path.splitext('python.png')[0]
'python'
فقط در استفاده از این متد یک نکته وجود دارد اگر نام فایل را به همراه آدرس آن بنویسید خروجی به صورت زیر می شود:
file_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
همانطور که مشاهده می کنید زمانی که آدرس آن فایل را هم بنویسید، این متد به جای جدا کردن نام و فرمت فایل میاید آدرس آن فایل و نام فایل را از فرمت فایل جدا می کند. می توان از روش زیر استفاده نمود تا خروجی به صورت بالا در نیاید:
file_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 = آخرین زمان تغییر متادیتا
os.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)
اگر فقط مشخصه خاصی را می خواهید می توانید به صورت زیر عمل کنید:
os.stat('directory').st_size
4096
os.path.getmtime()
آخرین زمان دستکاری فایل یا دایرکتوری را نشان می دهد.
os.path.getmtime('python.png')
1554597604.1962452
همان گونه که می بینید زمان به نمایش درآمده خوانا نبوده، برای خوانایی بهتر می توان به صورت زیر عمل نمود:
from datetime import datetime
mode_time = datetime.fromtimestamp(os.path.getmtime('python.png'))
print(mode_time)
2019-04-07 00:40:04.196245
os.system()
می توان دستورات ترمینال را در این متد اجرا نمود.
os.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ها استفاده بکنیم.
import glob
glob.glob(''/home/milad/programming/[pP]*')
['python', 'Perl', 'python unit test']
در خط دوم گفتیم برو در مسیر home/milad/programming دنبال فایل یا دایرکتوری هایی بگرد که نام اولشان با حرف p بزرگ یا کوچک شروع شده باشد.
os.remove()
این متد برای حذف فایل می باشد. در صورت اقدام به حذف دایرکتوری با این متد استثنا رخ می دهد.
os.remove('python.png')
در استفاده از این متد محتاط باشید زیرا در صورت اشتباه فایل دیگری را اقدام به حذف خواهید کرد!
os.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 را حذف می کند. فقط توجه فرمایید تمامی دایرکتوری ها باید فاقد فایل باشند تا بتوان آن ها را حذف نمود.
os.removedirs('foo/dir1/dir2')
os.rmdir()
برای حذف دایرکتوری های خالی می باشد.
os.rmdir('music')
shutil.rmtree()
برای حذف دایرکتوری هایی می باشد که دارای محتویات بوده.
shutil.rmtree('/home/milad/books')
در کد بالا دایرکتوری books را که دارای محتویات بوده است را حذف کردیم.
subprocess.call()
می توان با استفاده از این متد دستورات قابل اجرا در ترمینال را اجرا کرد. این متد روش بهتر و پیشنهاد شده ای نسبت به os.system می باشد.
import 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()
همانند متد قبلی بوده با این تفاوت که می توان خروجی دستور اجرا شده را در متغییر ذخیره کرد.
import 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()
متاسفانه این متد فقط در ویندوز قابل استفاده بوده (حداقل تا نسخه ۳.۷.۲ اینجوری هستش)، اما به هر حال اگر شما به این متد مسیر یک فایل را بدهید آن فایل با برنامه پیش فرض انتخاب شده شروع به اجرا می کند.
os.startfile('C:\pirahan_sorati.mp3')
در مثال بالا فایل pirahan_sorati.mp3 مثلا با برنامه vlc که به عنوان برنامه پیش فرض برای پخش فایل های صوتی از سمت کاربر انتخاب شده است پخش می شود. شما می توانید در تنظیمات مشخص کنید که هر فایل با چه برنامه ای اجرا بشود. (شاید بشینم همچین قابلیتی برای گنو هم اضافه بکنم :) )
shutil.copy()
متد copy در ماژول shutil برای کپی کردن فایل ها می باشد. ابتدا نام فایلی که قرار است کپی شود را نوشته و سپس مقصد آن را. در صورت موفقیت آمیز بودن عمل کپی، مقدار بازگشتی آن آدرس مقصد و نام فایلی است که کپی شده است. زمانی که یک فایل را کپی می کنید زمان دسترسی و آخرین زمان دستکاری آن هم به روز می شود.
shutil.copy('python.png', '/home/milad/pictures/python-pic')
'/home/milad/pictures/python-pic/python.png'
شما قادر هستید تا نام فایلی که قرار است کپی شود را در مقصد با یک نام دیگر ذخیره کنید به صورت زیر:
shutil.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 بر روی آن فایل انجام می شود، پس در کپی کردن فایل ها محتاط باشید تا تا بر اثر اشتباه محتویات یک فایل را پاک نکنید.
files = 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 کپی کن. به همین راحتی تونستیم کاری که حوصله سر بر و زمان بر بودش را با نوشتن یک اسکریپت در عرض چند ثانیه به راحتی کپی کنیم. پس این خلاقیت شماس که چجوری بتونید با استفاده از این چیزهایی که آموزش دادم کارهای دستی خودتونو به صورت اتوماتیک در بیارید یا مشکلات را حل کنید.
منتظر قسمت بعدی این آموزش باشید.
اگر این آموزش برای شما مفید بود خوشحال میشم با لایک کردن این مطلب باعث دلگرمی بشید. با تشکر
مطلبی دیگر از این انتشارات
پیچ و خم مسیر زندگی یک برنامه نویس نوجوان
مطلبی دیگر از این انتشارات
آموزش برنامه نویسی با ضمانت استخدام ( نقد کنید )
مطلبی دیگر از این انتشارات
آشنایی با وب اسکرپینگ | Web Scraping