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

کسب و کار

با استفاده از ماژول os و glob به صورت انبوه نام را تغییر دهید.

از ماژول os و ماژول glob برای تغییر و تغییر نام نام فایل ها در یک پوشه به صورت انبوه با افزودن رشته ها یا اعداد متوالی قبل و بعد از نام فایل ها استفاده کنید.

نمونه ساختار فایل

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

.
└── testdir
    ├── a.jpg
    ├── b.jpg
    ├── c.jpg
    ├── d.jpg
    └── e.jpg

چیزهایی که باید در نظر داشت

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

لیست فایل ها را با ماژول glob دریافت کنید

ماژول glob تمام نام مسیرهایی را که با الگوی مشخص شده مطابق با قوانین استفاده شده توسط پوسته یونیکس مطابقت دارند، پیدا می کند.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

به عنوان مثال، تابع زیر را می توان برای دریافت لیستی از نام فایل ها و دایرکتوری ها در فهرست فعلی استفاده کرد.
glob.glob('./*')
استدلال می تواند یک مسیر مطلق یا یک مسیر نسبی باشد.

در این مثال، به شکل زیر خواهد بود.

import glob

print(glob.glob('./testdir/*'))
# => ['./testdir/a.jpg', './testdir/b.jpg', './testdir/c.jpg', './testdir/d.jpg', './testdir/e.jpg']

به جای a.jpg، می توانید موارد زیر را با مسیر آرگومان اضافه کنید.
./testdir/a.jpg

همانطور که در زیر نشان داده شده است، می‌توانید از علامت‌های عام (*) برای دریافت فقط پسوندهای خاص استفاده کنید.
glob.glob('./testdir/*.jpg')

می توان از تطبیق الگوی زیر استفاده کرد.

  • *: با همه چیز مطابقت دارد.
  • ?با هر شخصیتی مطابقت دارد.
  • [abc]: با یک کاراکتر از a، b یا c مطابقت دارد.
  • [!abc]: با یک کاراکتر غیر از a، b یا c مطابقت دارد

تغییر نام با os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
نام فایل یا دایرکتوری src را به dst تغییر دهید.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

از تابع rename() ماژول os استفاده کنید، که نام آن را همانطور که از نام نشان می دهد تغییر می دهد.

import os
os.rename('./testdir/a.jpg', './testdir/a_000.jpg')

سپس، a.jpg به a_000.jpg تغییر نام خواهد داد.

تولید اعداد متوالی صفر پر شده با str.format()

به عنوان مثال، هنگام اضافه کردن اعداد متوالی به ده ها فایل، می خواهیم از “00” یا “11” به جای “0” یا “1” استفاده کنیم. اگر می خواهید صفرها را به این ترتیب پر کنید، از متد str.format() استفاده کنید.

str.format(args,*کوارگ)
عملیات قالب بندی رشته را انجام می دهد. رشته ای که این متد را فراخوانی می کند می تواند شامل کاراکترهای معمولی یا فیلدهای جایگزین باشد که با {} از هم جدا شده اند.Built-in Types — Python 3.10.0 Documentation

نحو رشته های مشخصات فرمت
رشته قالب‌بندی حاوی «فیلد جایگزینی» است که در براکت‌های مجعد {} محصور شده است.

نحو فیلد جایگزین به شرح زیر است:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

به عبارت ساده تر، فیلد جایگزین با field_name شروع می شود که باعث می شود مقدار شی مشخص شده به جای فیلد جایگزین، قالب بندی و در خروجی درج شود. بعد از field_name، قسمت تبدیل را می توان با علامت تعجب ‘! بعد از field_name، قسمت تبدیل را می توان با علامت تعجب ‘! فرمت_spec را می‌توان با علامت “:” در پایان نوشت. این فرمت غیر پیش‌فرض مقداری که باید جایگزین شود را مشخص می‌کند.
string — Common string operations — Python 3.10.0 Documentation

اگر می‌خواهید فعلاً آن را با 0 پر کنید، موارد زیر را انجام دهید.

# 3を2桁でゼロ埋め
print('{0:02d}'.format(3))
# => 03

# Fill in the zeros with three and four digits for 4 and 6, respectively.
print('{0:03d}, {1:04d}'.format(4, 6))
# => 004, 0006

نمونه ای از کد برای افزودن یک رشته/عدد ترتیبی قبل از یک فایل

ابتدا نام فایل را با os.path.basename() دریافت کنید. سپس، یک رشته یا شماره ترتیبی در جلوی نام فایل اضافه کنید و آن را با مسیر اصلی با os.path.join() الحاق کنید.

مثال زیر img_ را به جلوی نام همه فایل ها اضافه می کند.

import os
import glob

path = "./testdir"
files = glob.glob(path + '/*')

for f in files:
    os.rename(f, os.path.join(path, 'img_' + os.path.basename(f)))

نتیجه به شرح زیر است.

.
└── testdir
    ├── img_a.jpg
    ├── img_b.jpg
    ├── img_c.jpg
    ├── img_d.jpg
    └── img_e.jpg

اگر می خواهید اعداد متوالی را اضافه کنید، عبارت for را به چیزی شبیه به این تغییر دهید: () enumerate تا اعداد شمارش شده به ترتیب از 0 بدست آید. در این حالت، عدد با سه رقم پر می شود.

for i, f in enumerate(files):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

در اینجا نتیجه است.

.
└── testdir
    ├── 000_a.jpg
    ├── 001_b.jpg
    ├── 002_c.jpg
    ├── 003_d.jpg
    └── 004_e.jpg

اگر می خواهید به جای 0 با 1 شروع کنید، آرگومان دوم enumerate را روی 1 قرار دهید.

for i, f in enumerate(files, 1):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

اینجوری میشه

.
└── testdir
    ├── 001_a.jpg
    ├── 002_b.jpg
    ├── 003_c.jpg
    ├── 004_d.jpg
    └── 005_e.jpg

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

از os.path.splitext() برای تقسیم فایل به پسوند و مسیر ریشه استفاده کنید و سپس رشته ها یا اعداد ترتیبی را به مسیر ریشه اضافه کنید. در مثال زیر، _img بعد از نام همه فایل ها اضافه می شود.

import os
import glob

files = glob.glob('./testdir/*')

for f in files:
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_img' + fext)

نتیجه این است.

.
└── testdir
    ├── a_img.jpg
    ├── b_img.jpg
    ├── c_img.jpg
    ├── d_img.jpg
    └── e_img.jpg

مانند اضافه کردن رشته/عدد ترتیبی قبل از فایل، هنگام اضافه کردن یک عدد ترتیبی، عبارت for را تغییر دهید.

for i, f in enumerate(files):
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_' + '{0:03d}'.format(i) + fext)
.
└── testdir
    ├── a_000.jpg
    ├── b_001.jpg
    ├── c_002.jpg
    ├── d_003.jpg
    └── e_004.jpg