Пакетное изменение имени файла в 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 вы можете получить следующее, добавив аргумент path.
./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] "}"

Проще говоря, поле замены начинается с имени_поля, что приводит к форматированию и вставке в вывод значения указанного объекта вместо поля замены. После имени_поля может следовать поле преобразования с восклицательным знаком '! После имени_поля может следовать поле преобразования с восклицательным знаком '! Формат_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

Если вы хотите начать с 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