Binago ng batch ang pangalan ng file sa Python sa pamamagitan ng pagdaragdag ng string o sequential number bago at pagkatapos ng pangalan ng file

Negosyo

Palitan ang pangalan nang maramihan gamit ang os module at glob module.

Gamitin ang os module at glob module upang baguhin at palitan ang pangalan ng mga pangalan ng file sa isang folder nang maramihan sa pamamagitan ng pagdaragdag ng mga string o sequential na numero bago at pagkatapos ng mga pangalan ng file.

Halimbawang istraktura ng file

Kunin ang sumusunod na istraktura ng file bilang isang halimbawa. Sa kasong ito, ipinapalagay na mayroon lamang mga file (walang mga folder) sa folder.

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

Mga bagay na dapat tandaan

Dahil ang proseso ay nagsasangkot ng pagpapalit ng pangalan ng file, i-save ang orihinal na file nang hiwalay upang ito ay mai-save kung sakaling mabigo.

Kunin ang listahan ng file gamit ang glob module

Hahanapin ng glob module ang lahat ng pathname na tumutugma sa tinukoy na pattern ayon sa mga panuntunang ginagamit ng Unix shell.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Halimbawa, ang sumusunod na function ay maaaring gamitin upang makakuha ng isang listahan ng mga pangalan ng file at direktoryo sa kasalukuyang direktoryo.
glob.glob('./*')
Ang argument ay maaaring isang ganap na landas o isang kamag-anak na landas.

Sa halimbawang ito, magiging ganito ang hitsura nito.

import glob

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

Sa halip na a.jpg, maaari mong makuha ang sumusunod, na may idinagdag na landas ng argumento.
./testdir/a.jpg

Maaari ka ring gumamit ng mga wildcard (*) upang makakuha lamang ng mga partikular na extension, tulad ng ipinapakita sa ibaba.
glob.glob('./testdir/*.jpg')

Maaaring gamitin ang sumusunod na pagtutugma ng pattern.

  • *: Tugma sa lahat.
  • ?Tumutugma sa anumang solong karakter.
  • [abc]: Tumutugma sa isang karakter mula sa a, b, o c.
  • [!abc]: Tumutugma sa isang karakter maliban sa a, b, o c

Palitan ang pangalan gamit ang os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Palitan ang pangalan ng file o direktoryo na src sa dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Gamitin ang function rename() ng os module, na papalitan ang pangalan nito gaya ng iminumungkahi ng pangalan.

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

Pagkatapos, ang a.jpg ay papalitan ng pangalan sa a_000.jpg.

Bumubuo ng zero-filled sequential number na may str.format()

Halimbawa, kapag nagdaragdag ng mga sequential na numero sa dose-dosenang mga file, gusto naming gamitin ang “00” o “11” sa halip na “0” o “1”. Kung gusto mong punan ang mga zero sa ganitong paraan, gamitin ang str.format() method.

str.format(args,*kwargs)
Nagsasagawa ng mga operasyon sa pag-format ng string. Ang string na humihimok sa paraang ito ay maaaring maglaman ng mga normal na character o mga patlang ng pagpapalit na pinaghihiwalay ng {}.Built-in Types — Python 3.10.0 Documentation

Syntax ng mga string ng detalye ng format
Ang string ng pag-format ay naglalaman ng “papalit na patlang” na nakapaloob sa mga kulot na bracket {}.

Ang syntax ng kapalit na field ay ang mga sumusunod:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Sa mas simpleng mga termino, ang kapalit na field ay nagsisimula sa field_name, na nagiging sanhi ng halaga ng tinukoy na bagay na ma-format at maipasok sa output sa halip na sa kapalit na field. Pagkatapos ng field_name, ang patlang ng conversion ay maaaring sundan ng tandang padamdam ‘! Pagkatapos ng field_name, ang patlang ng conversion ay maaaring sundan ng tandang padamdam ‘! Ang format_spec ay maaaring isulat gamit ang isang tutuldok na ‘:’ sa dulo. Tinutukoy nito ang hindi default na format ng halagang papalitan.
string — Common string operations — Python 3.10.0 Documentation

Kung gusto mong punan ito ng 0 sa ngayon, gawin ang sumusunod.

# 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

Halimbawa ng code upang magdagdag ng string/sequential number bago ang isang file

Una, kunin ang pangalan ng file na may os.path.basename(). Pagkatapos, magdagdag ng string o sequential number sa harap ng pangalan ng file, at pagsamahin ito sa orihinal na path na may os.path.join().

Ang sumusunod na halimbawa ay nagdaragdag ng img_ sa harap ng lahat ng mga pangalan ng file.

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)))

Ang resulta ay ang mga sumusunod.

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

Kung gusto mong magdagdag ng mga sunud-sunod na numero, baguhin ang para sa pahayag sa isang bagay na tulad nito: enumerate() upang mabilang ang mga numero sa pagkakasunud-sunod mula sa 0. Sa kasong ito, ang numero ay puno ng tatlong digit.

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

Narito ang resulta.

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

Kung gusto mong magsimula sa 1 sa halip na 0, itakda ang pangalawang argumento ng enumerate sa 1.

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

Ganito iyan.

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

Halimbawa ng code para magdagdag ng string/sequential number pagkatapos ng file

Gamitin ang os.path.splitext() upang hatiin ang file sa extension at root path, at pagkatapos ay magdagdag ng mga string o sequential na numero sa root path. Sa sumusunod na halimbawa, idinaragdag ang _img pagkatapos ng lahat ng pangalan ng file.

import os
import glob

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

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

Ang resulta ay ito.

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

Tulad ng pagdaragdag ng string/sequential number bago ang isang file, baguhin ang for statement kapag nagdadagdag ng sequential number.

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