Batch menukar nama fail dalam Python dengan menambah rentetan atau nombor berjujukan sebelum dan selepas nama fail

Perniagaan

Namakan semula secara pukal menggunakan modul os dan modul glob.

Gunakan modul os dan modul glob untuk menukar dan menamakan semula nama fail dalam folder secara pukal dengan menambah rentetan atau nombor berjujukan sebelum dan selepas nama fail.

Contoh struktur fail

Ambil struktur fail berikut sebagai contoh. Dalam kes ini, diandaikan bahawa terdapat hanya fail (tiada folder) dalam folder.

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

Perkara yang perlu diingat

Memandangkan proses itu melibatkan penamaan semula fail, simpan fail asal secara berasingan supaya ia boleh disimpan sekiranya berlaku kegagalan.

Dapatkan senarai fail dengan modul glob

Modul glob akan mencari semua nama laluan yang sepadan dengan corak yang ditentukan mengikut peraturan yang digunakan oleh cangkerang Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Sebagai contoh, fungsi berikut boleh digunakan untuk mendapatkan senarai fail dan nama direktori dalam direktori semasa.
glob.glob('./*')
Hujah boleh menjadi laluan mutlak atau laluan relatif.

Dalam contoh ini, ia akan kelihatan seperti berikut.

import glob

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

Daripada a.jpg, anda boleh mendapatkan yang berikut, dengan laluan hujah ditambah.
./testdir/a.jpg

Anda juga boleh menggunakan kad bebas (*) untuk mendapatkan sambungan khusus sahaja, seperti yang ditunjukkan di bawah.
glob.glob('./testdir/*.jpg')

Padanan corak berikut boleh digunakan.

  • *: Padan dengan segala-galanya.
  • ?Padan dengan mana-mana watak tunggal.
  • [abc]: Memadankan satu aksara daripada a, b atau c.
  • [!abc]: Memadankan satu aksara selain daripada a, b atau c

Namakan semula dengan os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Namakan semula fail atau direktori src kepada dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Gunakan fungsi rename() modul os, yang akan menamakan semula seperti namanya.

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

Kemudian, a.jpg akan dinamakan semula kepada a_000.jpg.

Menjana nombor jujukan yang diisi sifar dengan str.format()

Sebagai contoh, apabila menambah nombor berjujukan pada berpuluh-puluh fail, kami mahu menggunakan “00” atau “11” dan bukannya “0” atau “1”. Jika anda ingin mengisi sifar dengan cara ini, gunakan kaedah str.format().

str.format(args,*kwargs)
Melakukan operasi pemformatan rentetan. Rentetan yang menggunakan kaedah ini boleh mengandungi aksara biasa atau medan penggantian yang dipisahkan oleh {}.Built-in Types — Python 3.10.0 Documentation

Sintaks rentetan spesifikasi format
Rentetan pemformatan mengandungi “medan penggantian” yang disertakan dalam kurungan kerinting {}.

Sintaks medan gantian adalah seperti berikut:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Dalam istilah yang lebih mudah, medan gantian bermula dengan field_name, yang menyebabkan nilai objek yang ditentukan diformatkan dan dimasukkan ke dalam output dan bukannya medan gantian. Selepas field_name, medan penukaran boleh diikuti dengan tanda seru ‘! Selepas field_name, medan penukaran boleh diikuti dengan tanda seru ‘! Format_spec boleh ditulis dengan titik bertindih ‘:’ di hujungnya. Ini menentukan format bukan lalai bagi nilai yang akan diganti.
string — Common string operations — Python 3.10.0 Documentation

Jika anda ingin mengisinya dengan 0 buat masa ini, lakukan perkara berikut.

# 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

Contoh kod untuk menambah rentetan/nombor berurutan sebelum fail

Mula-mula, dapatkan nama fail dengan os.path.basename(). Kemudian, tambahkan rentetan atau nombor berjujukan di hadapan nama fail dan gabungkannya dengan laluan asal dengan os.path.join().

Contoh berikut menambah img_ ke hadapan semua nama fail.

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

Hasilnya adalah seperti berikut.

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

Jika anda ingin menambah nombor berjujukan, tukar pernyataan for kepada sesuatu seperti ini: enumerate() untuk mendapatkan nombor dikira mengikut tertib daripada 0. Dalam kes ini, nombor itu diisi dengan tiga digit.

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

Inilah hasilnya.

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

Jika anda ingin bermula dengan 1 dan bukannya 0, tetapkan hujah kedua untuk menghitung kepada 1.

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

Ia berjalan seperti ini.

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

Contoh kod untuk menambah rentetan/nombor berurutan selepas fail

Gunakan os.path.splitext() untuk membahagikan fail kepada sambungan dan laluan akar, kemudian tambah rentetan atau nombor berjujukan pada laluan akar. Dalam contoh berikut, _img ditambah selepas semua nama fail.

import os
import glob

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

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

Hasilnya begini.

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

Seperti menambahkan rentetan/nombor berjujukan sebelum fail, tukar penyataan for apabila menambah nombor berjujukan.

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