Faili nime muutmine Pythonis, lisades enne ja pärast failinime stringi või järjekorranumbri

Äri

Nimetage massiliselt ümber, kasutades os-moodulit ja glob-moodulit.

Kasutage os-moodulit ja glob-moodulit, et muuta ja ümber nimetada massiliselt kaustas olevaid failinimesid, lisades failinimede ette ja järele stringid või järjekorranumbrid.

Näidisfaili struktuur

Võtame näiteks järgmise faili struktuuri. Sel juhul eeldatakse, et kaustas on ainult failid (mitte kaustad).

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

Asjad, mida silmas pidada

Kuna protsess hõlmab faili ümbernimetamist, salvestage originaalfail eraldi, et seda saaks ebaõnnestumise korral päästa.

Saada failide nimekiri globi mooduliga

Glob-moodul leiab kõik teekonnanimed, mis vastavad määratud mustrile vastavalt Unixi shell'i poolt kasutatavatele reeglitele.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Näiteks saab praeguse kataloogi failide ja kataloogide nimede loendi saamiseks kasutada järgmist funktsiooni.
glob.glob('./*')
Argumendiks võib olla absoluutne tee või suhteline tee.

Selles näites näeb see välja järgmiselt.

import glob

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

Faili a.jpg asemel saate järgmise tulemuse, millele on lisatud argumendi tee.
./testdir/a.jpg

Võite kasutada ka metsikuid sümboleid (*), et saada ainult konkreetseid laiendusi, nagu allpool näidatud.
glob.glob('./testdir/*.jpg')

Kasutada saab järgmist mustri sobitamist.

  • *: Sobib kõigega.
  • ?Vastab mis tahes üksikule tähemärgile.
  • [abc]: Vastab üksiku tähemärgi a, b või c hulgast.
  • [!abc]: Vastab ühele tähemärgile, mis ei ole a, b või c.

Ümbernimetamine funktsiooniga os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Nimetage fail või kataloog src ümber dst-ks.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Kasutage os-mooduli funktsiooni rename(), mis nimetab selle ümber vastavalt nimele.

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

Seejärel nimetatakse fail a.jpg ümber failiks a_000.jpg.

Nulliga täidetud järjestikuste numbrite genereerimine str.format() abil

Näiteks, kui lisame kümnetele failidele järjestikuseid numbreid, soovime kasutada “00” või “11”, mitte “0” või “1”. Kui soovite nullid niimoodi täita, kasutage meetodit str.format().

str.format(args,*kwargs)
Teostab stringi vormindamise operatsioone. Seda meetodit käivitav string võib sisaldada tavalisi sümboleid või asendusvälju, mis on eraldatud {}-ga.Built-in Types — Python 3.10.0 Documentation

Vorminguspetsifikaadi stringide süntaks
Vormingu string sisaldab “asendusvälja”, mis on ümbritsetud kõverate sulgude {} sisse.

Asendusvälja süntaks on järgmine:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Lihtsamalt öeldes algab asendusväli väljaga field_name, mis põhjustab, et asendusvälja asemel vormindatakse ja sisestatakse väljundisse määratud objekti väärtus. Pärast field_name võib teisendusväljale järgneda hüüumärk '! Pärast field_name võib teisendusväljale järgneda hüüumärk '! Format_spec võib kirjutada kooloniga ':' lõpus. See määrab asendatava väärtuse mittetäieliku formaadi.
string — Common string operations — Python 3.10.0 Documentation

Kui soovite seda esialgu täita 0-ga, tehke järgmist.

# 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

Näide koodist, mis lisab faili ette string\jooksva numbri

Esmalt saad faili nime abil os.path.basename(). Seejärel lisage failinime ette string või järjekorranumber ja ühendage see algse teega os.path.join().

Järgmine näide lisab kõigi failinimede ette 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)))

Tulemus on järgmine.

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

Kui soovite lisada järjestikuseid numbreid, siis muutke for-käsklust millekski selliseks: enumerate(), et saada numbreid loetud järjekorras alates 0. Sellisel juhul täidetakse number kolme numbriga.

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

Siin on tulemus.

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

Kui soovite alustada 0 asemel 1-st, seadke enumerate teise argumendi väärtuseks 1.

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

See käib nii.

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

Näide koodist, mis lisab faili järel string\jooksva numbri

Kasutage os.path.splitext(), et jagada fail laiendiks ja juurteeks ning seejärel lisada juurteele stringid või järjekorranumbrid. Järgmises näites lisatakse _img kõigi failinimede järele.

import os
import glob

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

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

Tulemus on järgmine.

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

Sarnaselt string\jooksva numbri lisamisega enne faili, muutke for-avaldust, kui lisate järjestikuse numbri.

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