Пакетная змена імя файла ў 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,*кваргі)
Выконвае аперацыі фарматавання радкоў. Радок, які выклікае гэты метад, можа ўтрымліваць звычайныя сімвалы або палі замены, падзеленыя знакам {}.Built-in Types — Python 3.10.0 Documentation

Сінтаксіс радкоў спецыфікацыі фармату
Радок фарматавання змяшчае «поле замены», заключана ў фігурныя дужкі {}.

Сінтаксіс поля замены наступны:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_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
Copied title and URL