چقدر زمان صرف تغییر نام فایل های خود می کنید؟ آیا نمی دانید که می توانید این کار را سریعتر و راحت تر انجام دهید؟ اگر بتوانید در یک چشم به هم زدن تعداد زیادی فایل را تغییر نام دهید چه؟ پایتون دارای چندین ماژول و توابع داخلی است که دقیقاً این کار را انجام می دهد. در این مقاله یاد خواهید گرفت که چگونه از بسیاری از این ماژول ها و توابع برای تغییر نام و جابجایی فایل های خود به وسیله پایتون استفاده کنید.
پایتون یک زبان برنامه نویسی قدرتمند است. یادگیری آن به دلیل سینتکس ساده آن، آسان است و همچنین همه کاره است. تقریباً می توانید همه کارها را با آن انجام دهید که این امر محبوبیت گسترده آن را توجیه می کند.
حتی اگر یک توسعه دهنده حرفه ای نیستید، می توانید بهره وری روزانه خود را تنها با چند خط کد پایتون بهبود بخشید. من به مفهوم “تنبلی هوشمند” معتقد هستم. اگر مجبورید در روز کاری را بیش از سه بار انجام دهید، یک اسکریپت بنویسید و از دردسر آن کار تکراری نجات پیدا کنید!
اینکار ارزش آن را دارد که در ابتدا وقت بگذارم تا کارهایی را که باید اغلب انجام دهم را اتوماتیک کنم تا در نهایت در وقت خود صرفه جویی کنم. همچنین به من کمک می کند تا مهارت های حل مسئله خود را تقویت کنم. یکی از این کارها تغییر نام و جابجایی دسته ای از فایل ها در کامپیوتر است.
در این مقاله نحوه جابجایی و تغییر نام فایل های کامپیوتر را به وسیله پایتون به شما نشان می دهم.
بدون مقدمه، به سراغ اصل مطلب برویم! در این مقاله، از ویندوز 10 و پایتون 3.8.5 استفاده می کنم.
دستکاری های ضروری فایل ها و پوشه ها
برای گرم کردن خود، اجازه دهید برخی از دستکاری های ضروری را با استفاده از ماژول os انجام دهیم. این کار درک نحوه تغییر نام فایل ها در پایتون را در آینده آسان تر می کند.
ماژول os به اسکریپت ها اجازه می دهد تا مستقیماً با سیستم عامل تعامل داشته باشند. این ماژول بخشی از بسته ابزارهای داخلی استاندارد پایتون است و نیازی به نصب مجزا ندارد.
بیایید کدی بنویسیم تا پوشه را با os.chdir()
تغییر دهیم و سپس پوشه فعلی که درون آن قرار گرفته ایم را با os.getcwd()
نمایش دهیم.
# import os module
import os
# change directory
os.chdir('c:\\MyDirectory')
# display the current directory
cwd = os.getcwd()
# display directory content
print("current working directory:", cwd)
و این هم خروجی:
برای اجرای یک اسکریپت، ترمینال پایتون خود را باز کنید و اجرا کنید:
python your_scriptname.py
اگر در این مورد کنجکاو هستید، می توانید اطلاعات بیشتری در مورد os.chdir()
را در اینجا و os.getcwd()
را در اینجا بخوانید.
هنگامی که یک مفهوم، کتابخانه یا چارچوب جدید را بررسی می کنید، همیشه خواندن اسناد رسمی آن می تواند ایده خوبی باشد و توصیه می شود.
تغییر نام فایل ها در پایتون با os.rename()
اکنون که به برخی از اصول اولیه پرداختیم، بیایید متد rename
را از ماژول os برای تغییر نام فایل ها در پایتون اعمال کنیم. برای تغییر نام یک فایل، باید نام فعلی فایل را با مکان فعلی و نام جدید آن را با مکان مقصد وارد کنیم.
بیایید یک مثال اجرا کنیم. برای این آموزش، چند عکس جمع آوری کردم که قصد داریم نام آنها را در پایتون تغییر دهیم. این پوشه عکس های اولیه است.
ابتدا قصد داریم نام این تصویر زیبا از یک آسمان قرمز را تغییر دهیم. همانطور که می بینید، نام فایل چندان قابل خواندن نیست. بیایید نام آن را به red_sky.jpg
تغییر دهیم.
برای شروع، میتوانیم نام، نوع و مکان فایل را با properties دریافت کنیم. بعداً خواهیم دید که میتوانیم از پایتون برای دریافت نام فایلها در فهرست خود استفاده کنیم.
اسکریپت ما اینجاست:
# import os module
import os
# state file origin and destination as
# os.rename(source, destination)
os.rename(r'C:\py_scripts\photos\abhijeet-gaikwad-bokneofJXeI-unsplash.jpg', r'C:\py_scripts\photos\red_sky.jpg')
print("success")
رشته خام پایتون یک رشته معمولی است که پیشوند آن حرف r است. با کاراکتر هایی مانند بک اسلش بهعنوان کاراکتر عادی رفتار میکند و نه بهعنوان کاراکتر escape. این کار، درستیِ مسیر را تضمین می کند تا بتوانیمدر ویندوز فایل ها را جابجا کرده و نام آن ها را تغییر دهیم.
علاوه بر این، آخرین کاراکتر نمی تواند یک بک اسلش باشد زیرا یک خطای سینتکس ایجاد می کند.
بیایید اسکریپت خود را اجرا کنیم و خروجی را ببینیم:
فایل ما با موفقیت تغییر نام داد! شما می توانید اطلاعات بیشتری در مورد os.rename() را در اینجا ببینید.
نوشته مرتبط : مدیریت فایل ها در پایتون
اکنون که مکانیسم فرآیند تغییر نام فایل در پایتون را فهمیدیم ، باید بدانید که عملیات جابه جایی نیز مانند تغییر نام است و بالعکس. البته، اگر مکان منبع و مقصد روی پارتیشنها یا درایوها مختلف باشد، os.rename()
کار نمیکند. اگر به چنین موردی برخوردید، می توانید از shutil.move()
به جای آن استفاده کنید.
انتقال فایل ها در پایتون با shutil.move()
ماژول shutil نیز بخشی از ماژول استاندارد ابزار پایتون است. بنابراین نیازی به نصب ندارد.
Shutil به خودکارسازی فرآیند کپی و حذف فایل ها و/یا دایرکتوری ها کمک می کند. با استفاده از shutil.move()
، نه تنها می توان نام یک فایل را تغییر داد، بلکه می توان محل ذخیره فایل را نیز تغییر داد.
بیایید از تصویری که نام آن را تغییر دادیم استفاده کنیم red_sky.jpg
. ما آن را به یک پوشه جدید به نام awesome منتقل می کنیم و همچنین نام تصویر را به awesome_sky.jpg
تغییر می دهیم.
این یک اسکرین شات از فهرست عکس های من قبل از اجرای اسکریپت است.
بیایید فیلمنامه خود را بنویسیم. باید ماژول shutil
را وارد کنیم و مسیر اولیه فایل و همچنین مقصد آن را بیان کنیم. برای خوانایی بیشتر کد، مسیر اولیه را به متغیری به نام src
و مسیر مقصد را به dst
نسبت می دهیم.
در نهایت متد move
را از ماژول shutil فراخوانی می کنیم.
# import shutil
import shutil
# file source and destination
src=r'C:\py_scripts\photos\red_sky.jpg'
dst=r'C:\py_scripts\photos\awesome\awesome_sky.jpg'
# change file directory and rename file as awesome_sky
shutil.move(src, dst)
اکنون می توانید اسکریپت را در ترمینال پایتون خود اجرا کنید. این نتیجه نهایی است.
می بینید که ما با موفقیت فایل خود را به دایرکتوری awesome منتقل کردیم و نام آن را به awesome_sky.jpg
تغییر دادیم . بنابراین، در این مثال، نحوه تغییر نام و انتقال فایلها در پایتون را یاد گرفتیم.
وقتی از shutil.move()
استفاده می کنید ، یک کپی از فایل در مسیر مقصد ساخته می شود و نسخه اصلی حذف می شود.
shutil.move()
، بر خلاف os.rename()
می تواند دستگاه ها، دیسک ها یا پارتیشن های مختلف را مدیریت می کند. در چنین حالتی shutil.move()
ابتدا فایل را کپی کرده و سپس آن را از محل اصلی خود حذف می کند.
اگر نمی خواهید نام فایل را تغییر دهید، نیازی به ارسال آن در پارامتر مقصد ندارید و می توانید فقط آدرس پوشه جدید را بنویسید. مثلاً:
shutil.move("my_file.txt", "new_directory")
در اینجا می توانید اطلاعات بیشتری در مورد shutil.move()
کسب کنید.
انتقال فایل ها در پایتون با shutil.copy()
می توانیم از shutil.copy()
برای کپی کردن یک فایل از یک دایرکتوری به پوشه دیگر نیز استفاده کنیم. بر خلاف shutil.move()
، متد shutil.copy()
فایل را از محل اصلی خود حذف نمی کند.
در این مثال، من یک عکس به نام photo_1.jpg
دارم که می خواهم آن را در پوشه ای به نام data1 کپی کنم، همانطور که در اینجا مشاهده می کنید:
بیایید با استفاده از shutil.copy()
برای انجام این کار یک اسکریپت بنویسیم.
# import
import shutil
# state source and destination folder
src = r'C:\py_scripts\photos\photo_1.jpg'
dst = r'C:\py_scripts\photos\data1'
# copy src to dst
shutil.copy(src, dst)
و این هم از نتیجه:
فایل ما photo_1.jpg
، هنوز در دایرکتوری منبع وجود دارد و اسکریپت ما یک کپی از همان فایل را در پوشه data1
ایجاد کرده است.
متد shutil.copy()
راهی برای انتقال فایل ها در پایتون بدون نیاز به حذف آنها از دایرکتوری های اصلی در اختیار ما قرار می دهد. شما می توانید در مورد این موضوع در مستندات آن اطلاعات بیشتری کسب کنید.
تغییر نام فایل ها در پایتون با متد Path.rename() از کتابخانه Pathlib
کتابخانه pathlib
یک فریمورک شیء گرا برای مدیریت مسیردهی در سیستم فایل است. اگر بخواهید بدانید که چه زمانی بین pathlib و ماژول os انتخاب کنید، چند تفاوت کلیدی بین آنها وجود دارد:
ماژول os از نمایش رشته ای از مسیرها استفاده می کند، در حالی که pathlib
یک شیء از دایرکتوری ایجاد می کند استفاده از pathlib
امکانی برای خوانایی و نگهداری بهتر کد و همچنین قابلیت حمل به سیستم عامل های مختلف فراهم می کند.
بیایید نام یک فایل را با pathlib
تغییر دهیم. در این مثال، یک عکس جدید می گیریم و با استفاده از pathlib
نام آن را تغییر می دهیم. همانطور که می بینید، نام تصویر ما در حال حاضر چندان قابل خواندن نیست.
خب، بیایید فیلمنامه خود را بنویسیم. Pathlib
متدی تمیز و شهودی به نام cwd() برای ایجاد مسیرها دارد که میتوانیم آن را به صورت زیر بنویسیم:
Path.cwd() / 'sub directory' / 'filename'
هنگامی که مسیر فایل فعلی ما با کلاس Path
تنظیم شد، سپس از متد rename
با مسیر جدید و نام فایل به عنوان آرگومان استفاده می کنیم.
این هم کد:
# import Path class from pathlib
from pathlib import Path
# define file path that we want to rename
filepath = Path.cwd() / 'photos' / 'diego-ph-5LOhydOtTKU-unsplash.jpg'
# rename file
filepath.rename(Path.cwd() / 'photos' / 'shooting_star.jpg')
نتیجه را در زیر ببینید.
نام فایل ما اکنون shooting_star.jpg
است. میتوانید اطلاعات بیشتری درباره کتابخانه pathlib برای تغییر نام فایلها در پایتون را در اینجا ببینید.
تغییر نام دسته ای فایل ها در پایتون با os.rename() و os.listdir()
ما میتوانیم فایلها را یکی یکی تغییر نام دهیم، اما اگر فایلهای زیادی داشته باشیم، ممکن است خسته کننده و/یا غیرممکن شود. تصور کنید که برای آموزش یک مدل بینایی کامپیوتری باید مجموعه داده ای با هزاران تصویر تهیه کنید. در اینصورت اینکار به سادگی با دست قابل انجام نیست.
در عوض، میتوانیم نام فایلها را به صورت دستهای در پایتون تغییر دهیم. بیایید یک پوشه با صدها عکس را برای تغییر نام با استفاده از Python انتخاب کنیم.
باز هم از os.rename()
استفاده خواهیم کرد. اما این بار، باید تابعی بنویسیم تا در این دایرکتوری دور بزنیم و نام فایل ها را یکی پس از دیگری تغییر دهیم. فراموش نکنید که مسیر پوشه را در مقصد اضافه کنید.
از متد os.path.join()
استفاده خواهیم کرد. در پارامتر اول آدرس پوشه فایل و در پارامتر دوم نام فایل را قرار می دهیم. این کار باعث می شود کد خواناتر و تمیزتر شود. همچنین استفاده مجدد از همان کد را در یک سیستم عامل دیگر آسان تر می کند.
در متغیر dst
، پارامتر دوم نام فایل جدید است. من نام فایل جدید را به متغیری به نام new
اختصاص دادم.
تابع enumerate()
یک مجموعه را به عنوان آرگومان می گیرد و یک شیء قابل شمارش از آن را برمی گرداند و یک شمارنده به عنوان کلید شی اضافه می کند.
# import os module
import os
# folder path and destination
path_name = r'C:\py_scripts\photos\data'
# loop through the directory to rename all the files
for count, filename in enumerate(os.listdir(path_name)):
new ="pic-" + str(count) + '.jpg' # new file name
src = os.path.join(path_name, filename) # file source
dst = os.path.join(path_name, new) # file destination
# rename all the file
os.rename(src, dst)
بیایید نتایج را بررسی کنیم:
تصاویر ما با موفقیت تغییر نام دادند. اگر میخواهید در مورد آن بیشتر بدانید os.listdir()
، میتوانید مستندات را در اینجا و همچنین دوره ما در مورد کار با فایلها و دایرکتوریها در پایتون را بررسی کنید.
تغییر نام دسته ای فایل ها در پایتون با os.scandir()
ما میتوانیم نام چندین فایل را به جای os.listdir()
با استفاده از os.scandir()
نیز تغییر دهیم. os.scandir() بسیار سریعتر است زیرا یک تکرار کننده از اشیاء os.DirEntry به ما می دهد.
بیایید کدی با این متد بنویسیم. در این کد از یک پوشه به نام data1
با چندین عکس استفاده خواهیم کرد. این بار، در نام فایل های خود، img
را به عنوان پیشوند قرار می دهیم.
# import os module
import os
# folder path
path = r'C:\py_scripts\photos\data1'
# set counter
count = 1
for f in os.scandir(path):
if str(f.name).endswith('.jpg'):
new_file = 'img-' + str(count)+'.jpg'
src = os.path.join(path, f.name)
dst = os.path.join(path, new_file)
os.rename(src, dst)
count += 1
# close iterator to free some resources
os.scandir(path).close()
در اینجا، برخلاف کد قبلی، یک عبارت شرطی اضافه کردم تا بررسی کنم که آیا فایل پسوند .jpg
دارد یا خیر. در این صورت فقط فایل هایی با پسوند .jpg
تغییر نام می دهند.
فراموش نکنید که تکرار کننده os.scandir()
را در انتها ببندید تا برخی منابع آزاد شود و کد شما کارآمدتر شود.
همانطور که می بینید، ما فقط پوشه data1 خود را با استفاده از متد os.scandir()
تغییر نام دادیم:
میتوانید درباره نحوه تغییر نام دستهای فایلها در پایتون با os.scandir()
در اینجا بیشتر بررسی کنید.
تغییر نام دسته ای فایل ها در پایتون با متد Path.iterdir() از کتابخانه Pathlib
میتوانیم با استفاده از متد Path.iterdir()
در pathlib نیز فایل های خود را به صورت دسته ای تغییر نام دهیم. مشابه قبل ، Path.iterdir()
سریعتر از os.listdir()
است.
این بار من یک پوشه به نام data1 دارم با عکس هایی به نام photo_1.jpg
, photo_2.jpg
و …. می خواهم نام آنها را به img-1.jpg
, img-2.jpg
, … تغییر دهم.
بیایید اسکریپتی بنویسیم تا نام همه آنها را تغییر دهیم.
# import
from pathlib import Path
# set the directory
path = Path.cwd() / 'photos' / 'data1'
# set a counter
counter = 1
# loop through the directory and rename the files
for file in path.iterdir():
if file.is_file():
new_file = "img-" + str(counter) + file.suffix
file.rename(path / new_file)
counter += 1
و این هم از نتیجه:
توصیه میشود از os.scandir()
یا Path.iterdir()
استفاده کنید، زیرا این متد ها از نظر عملکرد بهتر هستند، به خصوص در پوشههایی که تعداد زیادی فایل دارند. به عنوان یک دستورالعمل کلی، تلاش برای نوشتن کد بهینه تر همیشه خوب است زیرا باعث صرفه جویی در زمان و منابع می شود.
میتوانید درباره نحوه تغییر نام دستهای فایلها در پایتون با pathlib با Path.iterdir()
در اینجا بیشتر مطالعه کنید.
تغییر نام دسته ای فایل ها به صورت مرتب شده در پایتون
روش های قبلی برای تغییر نام فایل ها کارآمد هستند، اما فایل ها را مرتب نمی کنند. برای مرتب نگه داشتن فایلها، میتوانیم آنها را بر اساس آخرین زمان تغییرشان با استفاده از متد os.path.getmtime(x)
مرتب کنیم. سپس میتوانیم نام فایلها را با توجه به زمان تغییرشان تغییر دهیم و با استفاده از zfill()
یک عدد ترتیبی به نام فایل اضافه کنیم.
بیایید کدی بنویسیم تا به ترتیب زمان فایل ها، نام فایل ها را در پوشه ای به نام data تغییر دهیم.
# import os module
import os
# directory path
path_name = r'C:\py_scripts\photos\data'
# Sort list of files based on last modification time in ascending order using list comprehension
name_list = os.listdir(path_name)
full_list = [os.path.join(path_name,i) for i in name_list]
sorted_list = sorted(full_list, key=lambda x: os.path.getmtime(x))
# initiate counter
count = 0
# loop through files and rename
for file in sorted_list:
# print(file)
prefix = "photo-"
counter = str(count).zfill(2)
new = prefix + counter + '.jpg' # new file name
src = os.path.join(path_name, file) # file source
dst = os.path.join(path_name, new) # file destination
os.rename(src, dst)
count +=1
این نتیجه نهایی است:
تغییر نام دسته ای فایل ها در پایتون با glob.glob() و glob.iglob()
همچنین میتوانیم از ماژول glob
برای بازیابی فایلها و نام مسیرها، مطابق با یک الگوی از پیش تعیینشده استفاده کنیم. استفاده از الگوها در glob
سریعتر از روشهای دیگر برای تطبیق نام مسیرها در پوشه ها است.
مشابه ماژول های قبلی که در این مقاله گفته شد، این ماژول نیز به صورت داخلی با پایتون عرضه می شود، بنابراین نیازی به نصب چیزی نداریم.
ما می توانیم از glob.glob()
یا glob.iglob()
برای بازیابی مسیرها به صورت بازگشتی از داخل دایرکتوری ها و زیر شاخه ها استفاده کنیم. برخلاف متد glob.glob()
، متد glob.iglob()
یک تکرار کننده برمی گرداند، به این معنی که همه مقادیر در حافظه ذخیره نمی شوند و کارایی بیشتری را ارائه می دهند.
در نهایت، میتوانیم عملیات تغییر نام فایلهایمان را با os.rename()
تکمیل کنیم.
الگوی بازگشتی دنبالهای از دستورالعملها است که تا زمانی که تشخیص دهد برخی از شرایط برآورده شده است به ابتدای خودش بازمیگردد.
اگر تصمیم به استفاده از الگوی بازگشتی دارید، بیشتر مراقب باشید. باید شرایط توقف را به درستی تنظیم کنید، در غیر این صورت، می تواند به یک حلقه بی نهایت تبدیل شود و تابع بازگشتی برای همیشه خود را فراخوانی می کند.
احتمالاً میتوانید تصور کنید که اگر کد شما نام فایلهایتان را برای همیشه، یکی پس از دیگری، تغییر نام دهد، چه آسیبی میبیند… اگر میخواهید این موضوع را تست کنید، یک محیط مجازی (virtual envirement) تنظیم کنید و سیستم عامل خود را در حال فروپاشی تماشا کنید.
نوشته مرتبط = تابع بازگشتی چیست؟
در این مثال، ما روی پوشه ای به نام data1
کار خواهیم کرد که حاوی تصاویر زیادی است. می خواهیم نام همه آنها را تغییر دهیم. الگوی C:\py_scripts\photos\data1\**\*.jpg تمام تصاویر jpg را استخراج می کند. ابتدا، با نمایش نام فایل ها، بررسی می کنیم که فایل های مناسب را انتخاب کرده ایم یا نه.
# import glob
import glob
# glob.glob() returns a list of file names
print("Using glob.glob()")
files = glob.glob(r'C:\py_scripts\photos\data1\**\*.jpg', recursive = True)
for file in files:
print(file)
# glob.iglob() returns an iterator
print("\nUsing glob.iglob()")
for f in glob.iglob('C:\py_scripts\photos\data1\**\*.jpg', recursive = True):
print(f)
خروجی ما با استفاده از glob.glob()
:
و خروجی ما با استفاده از glob.iglob()
:
کد ما تصاویری را که قرار است تغییر نام دهند به درستی شناسایی کرده است و می توانیم تغییر نام را با استفاده از glob.glob()
، شروع کنیم. می توانید از کد زیر استفاده کنید:
# import
import os
import glob
# path
path = r'C:\py_scripts\photos\data1'
path_name = r'C:\py_scripts\photos\data1\**\*.jpg'
# set counter
counter = 1
for f in glob.glob(path_name, recursive = True):
#print(f)
new = "Pic_" + str(counter).zfill(5) + ".jpg"
dst = os.path.join(path, new)
os.rename(f, dst)
counter +=1
متد رشته zfill()
نام تصاویر را تا پنج رقم تغییر می دهد: Pic_00001.jpg
، Pic_00002.jpg
و غیره. تعداد ارقام را بر اساس نیاز خود تغییر دهید.
این نتیجه نهایی است:
در صورت تمایل از استفاده از glob.iglob()
می توانید از کد زیر استفاده کنید:
# import
import os
import glob
# path
path = r'C:\py_scripts\photos\data1'
path_name = r'C:\py_scripts\photos\data1\**\*.jpg'
# set counter
counter = 1
# glob.iglob() returns an iterator
for f in glob.iglob(path_name, recursive = True):
#print(f)
new = "Picture_" + str(counter) + ".jpg"
dst = os.path.join(path, new)
os.rename(f, dst)
counter +=1
این نتیجه نهایی است:
می توانید اطلاعات بیشتری در مورد glob.glob()
را در اینجا و glob.iglob()
را در اینجا بیابید.
تغییر نام دسته ای فایل ها در پایتون با os.walk(cwd)
این بار عکس هایی در 2 پوشه مختلف به نام data1
و data2
داریم. می خواهم نام آنها را تغییر داده و همه آنها را به پوشه دیگری به نام all
منتقل کنم. برای بررسی فایل ها در دو پوشه مختلف از os.walk(cwd)
استفاده می کنیم.
os.walk()
آدرس پوشه اصلی را به عنوان آرگومان دریافت کرده و پوشه ها و فایل های درون آن را جستجو می کند. نام فایل ها را در درخت دایرکتوری با رفتن از بالا به پایین یا پایین به بالا تولید می کند. سپس، تاپلی از سه عنصر ( dir_path
, dir_names
, file_names
) به دست می آورده به ما تحویل می دهد.
این محتویات پوشه data1
است:
و این هم پوشه data2
:
کد ما:
# import
import os
# define current working directory
cwd = 'C:\py_scripts\photos'
count = 1
for dir_path, dir_names, file_names in os.walk(cwd):
for f in file_names:
if f.endswith('.jpg'):
new = 'pic_' + str(count) + '.jpg'
dest_dir = os.path.join(cwd,'all')
# create new directory if does not exist
if not os.path.isdir(dest_dir):
os.mkdir(dest_dir)
os.rename(os.path.join(dir_path, f), os.path.join(dest_dir, new))
count += 1
و نتیجه:
پوشه های data1
و data2
اکنون خالی هستند و تصاویر ما تغییر نام داده و به پوشه all منتقل شده اند.
در اینجا می توانید اطلاعات بیشتری در مورد os.walk()
کسب کنید.
دیدگاهها