Organizing files in python - part 3

به قسمت سوم آموزش سازماندهی و کار با فایل ها و دایرکتوری ها در پایتون خوش آمدید . قسمت قبلی این آموزش را می توانید در اینجا بخوانید.os.path.join()دو یا چند آدرس را هوشمندانه به هم می چسباند و تبدیل به یک آدرس می کند.path = os.path.join(os.environ['HOME'], 'Downloads', 'python') print(path) /home/milad/Downloads/pythonos.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 : .pngos.stat()اطلاعاتی در رابطه با فایل و دایرکتوری می دهد که به شرح زیر می باشد:st_mode = protection bitsst_ino = inode numberst_device = devicest_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 4096os.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.196245os.system()می توان دستورات ترمینال را در این متد اجرا نمود.os.system('ls -ltrh python.png') -rw-r--r-- 1 linusek users 198K Apr 7 00:40 python.pngglob.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.pngsubprocess.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.pngos.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 کپی کن. به همین راحتی تونستیم کاری که حوصله سر بر و زمان بر بودش را با نوشتن یک اسکریپت در عرض چند ثانیه به راحتی کپی کنیم. پس این خلاقیت شماس که چجوری بتونید با استفاده از این چیزهایی که آموزش دادم کارهای دستی خودتونو به صورت اتوماتیک در بیارید یا مشکلات را حل کنید.منتظر قسمت بعدی این آموزش باشید.اگر این آموزش برای شما مفید بود خوشحال میشم با لایک کردن این مطلب باعث دلگرمی بشید. با تشکر