قبلا یه سری ویدیو آموزشی دانلود کردم ولی یه مشکل کوچکی داشتن، مشکلشون این بود که مثلا اسمشون اینجوری بود (اسم شماره.پارت اسم) و من نمیتونستم sort کنم باید هی بالا پایین بگردم دنبال ترتیبشونcrying منم حوصله نداشتم تک تک اسمشون عوض کنم ولی در عوض حوصله نوشتن یه اسکریپت داشتم که برام اینکار رو انجام بده DD;

زبان استفاده شده: Python 3

کتابخانه ها: re,os و سایر کتابخانه های استاندارد

اگه میخواهید بفهمید چکار کردم برید ادامه مطلب (;

با نام خدا شروع کنیم

direction = r"ادرس فولد اینجا وارد میکنیم"
files = get_file_names(direction) # فانکشن پایینی صدا میزنیم تا لیست فایل برگردونه

خوب در مرحله اول دایرکشن بهش میدیم (آدرس فولدری که میخواییم اینکارا انجام بدیم)

بعد با استفاده از این فانکشن که نوشتم همه ی فایلای پوشه به ما میده

def get_file_names(direction): # در اینجا ادرس میگیریم
    files = []
    for file_ in os.listdir(direction): # تک تک چک میکنیم
        filename,file_ext = os.path.splitext(file_) # دو قسمتشون میکنیم یکی اسم دومی هم نوعش
        if file_ext: # اگه نوع داره (یعنی فولدر نیست)
            files.append(file_) # فایله به لیستمون اضاف میکنیم
    return files # فایلا را برمیگردونیم

نکته 1: دلیلی که اسم متغییر file_ بجای file خالی استفاده کردم چون file از قبل تعریف شده و ارور میداد.

نکته 2: در قسمت اضافه کردن به لیستمون باید اسم کامل اضافه کنیم نه اونی که جدا کردیم.

خوب حالا که همه ی فایلا داریم میریم سراغ چک کردن و انجام عمل اصلی.

for file_ in files:
    new_name,want_to = find_replace(file_)
    if want_to == "y":
        os.rename("{}\\{}".format(direction,file_),"{}\\{}".format(direction,new_name))

در خط دوم ما یه فانکش دیگه داریم اسمش find_replace کار این پیدا کردن p.12 و گذاشتنش اول رشته.

خوب حالا دنبال روشی بودم که چک کنم مثلا مثال زیر p.12 داره یا نه اگه بود که بفهمه از کجا تا کجای رشته است که خداروشکر کتابخانه ی Regular expression داریم. (البته با این قبلا کار کردم ولی زیاد داخلش نرفتم)

Applying Comparison Operators to DataFrame - P.12 Data Analysis with Python and Pandas Tutorial.mp4

با استفاده از این کتابخانه تونستم چیزایی که میخوام را پیدا کنم حالا چطور مثلا p.12 پیدا کنم؟ بریم خط بعدی ببینیم چکار کردم

PATTERN = re.compile(r"p\W(\d)?\d")

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

search = PATTERN.search(file_name)

الگوش هم حرف p سپس \W(حرف بزرگ) که معنیش هرچی بجز فاصله، حرف یا عدد که برای پیدا کردن نقطه استفاده کردم خب بعد (\d)؟\d داریم، این \d یعنی عدده و ()? یعنی اگه یکی اضافه هست هم قبول کن برای فهمیدن این قسمت به مثال بعدی دقت کنید

p.1

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

خوب حالا جای چیزی که میخواستیم پیدا کردیم حالا نوبت پاک کردن و اضافه کردنش به اول اسم میرسه، برای اینکار از کد زیر استفاده کردم

span = search.span()
new_name = search.group().upper() + " " + file_name[:span[0]] + file_name[span[1]+1:]

در خط اول این کد میاد لوکیشن p.12 توی span میریزه

خط دومی میاد اول p.12 به حرف بزرگ تبدیل میکنه(این هم برای خودم زدمش زیاد مهم نیست :)) سپس به اول رشته اضافه میکنه، بعد هم دوتا ساب استرینگ داریم که اولی میاد از اولین کاراکتر تا اخرین کاراکتر قبل p و دو می میاد از دومین کاراکتر بعد 2 تا اخر اضافه میکند(چرا دومی؟ بخاطر یه فاصله:)))

در خط بعدی هم این داریم

print("Previous is: \n{}\n{} \nThe new one is: \n{}\n{} \nif you wanna change press y: (Y)".format(file_name,"-"*10,new_name,"-"*10))

که کار زیر انجام میدهد

========================================
Previous is:
Applying Comparison Operators to DataFrame - p.12 Data Analysis with Python and Pandas Tutorial.mp4
----------
The new one is:
P.12 Applying Comparison Operators to DataFrame - Data Analysis with Python and Pandas Tutorial.mp4
----------
if you wanna change press y: (Y)
y
========================================

بعد یه ورودی ازش میگیریم میریزیم تو want_to و اسم و want-to برمیگردونیم.

نکته: همه ی فانکشن داخل try/except گذاشتم تا اگر اسم یا مشکلی پیش اومد ارور نده بره بعدی (در سورس راحتتر میتونید ببینید)

حالا ادامه کد اصلی، در خط سوم میگیم اگه تو متغییر want_to مقدارش y باشه اسمش عوض کن اگه نه که بره بعدی

در خط چهارم برای تبدیل اسم فایل از کتابخانه ی os استفاده میکنیم

        os.rename("{}\\{}".format(direction,file_),"{}\\{}".format(direction,new_name))

به فانکشن rename دو ورودی میدیم ورودی اولی ادرس فایل و اسمش و ورودی دومی هم ادرس و اسم جدید میدیم.

تمام!! هههه مطمئنم که فکر میکردید کوتاه تر این باشه :)) البته میشد کوتاه تر این باشه مثلا در حد 5 6 خط کد ولی خودم خواستم یکم بیشتر بنویسم بعلاوه چیزایی که یادم رفته تمرین کنم. امیدوارم که خوشتون اومده باشد.

سورس برنامه

لاگ

منابعی که ازشون کمک گزفتم:

Rename multiple files in a directory in Python [duplicate]

6.2. re — Regular expression operations