Пакетна зміна назви файлу в Python, додаючи рядок або послідовний номер до і після імені файлу

Бізнес

Масово перейменуйте за допомогою модулів os і glob.

Використовуйте модуль os і модуль glob, щоб масово змінювати та перейменовувати імена файлів у папці, додаючи рядки або послідовні номери перед і після імен файлів.

Приклад структури файлу

Візьмемо для прикладу наступну файлову структуру. У цьому випадку передбачається, що в папці є лише файли (немає папок).

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

Про що варто пам’ятати

Оскільки процес передбачає перейменування файлу, збережіть оригінальний файл окремо, щоб його можна було зберегти в разі невдачі.

Отримайте список файлів за допомогою модуля glob

Модуль glob знайде всі імена шляхів, які відповідають заданому шаблону відповідно до правил, які використовуються оболонкою Unix.
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,*kwargs)
Виконує операції форматування рядків. Рядок, який викликає цей метод, може містити звичайні символи або поля підстановки, розділені символом {}.Built-in Types — Python 3.10.0 Documentation

Синтаксис рядків специфікації формату
Рядок форматування містить «поле заміни», укладене в фігурні дужки {}.

Синтаксис поля заміни такий:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Простіше кажучи, поле заміни починається з field_name, що змушує форматувати значення вказаного об’єкта та вставляти його у вихідні дані замість поля заміни. Після поля_назва після поля перетворення може стояти знак оклику ‘! Після поля_назва після поля перетворення може стояти знак оклику ‘! Формат_спец можна записати з двокрапкою ‘:’ в кінці. Це визначає формат значення, яке потрібно замінити, не за замовчуванням.
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

Якщо ви хочете почати з 1 замість 0, встановіть другий аргумент 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