paketno spreminjanje imena datoteke v programu Python z dodajanjem niza ali zaporedne številke pred in za imenom datoteke

Posel

Množično preimenovanje z uporabo modula os in modula glob.

Uporabite modul os in modul glob za množično spreminjanje in preimenovanje imen datotek v mapi z dodajanjem nizov ali zaporednih številk pred in za imeni datotek.

Primer strukture datoteke

Za primer vzemimo naslednjo strukturo datotek. V tem primeru se predpostavlja, da so v mapi samo datoteke (brez map).

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

Stvari, ki jih je treba upoštevati

Ker postopek vključuje preimenovanje datoteke, originalno datoteko shranite ločeno, da jo lahko shranite v primeru neuspeha.

Pridobite seznam datotek z modulom glob

Modul glob bo poiskal vsa imena poti, ki ustrezajo navedenemu vzorcu, v skladu s pravili, ki jih uporablja lupina Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Naslednjo funkcijo lahko na primer uporabite za pridobitev seznama imen datotek in imenikov v trenutnem imeniku.
glob.glob('./*')
Argument je lahko absolutna ali relativna pot.

V tem primeru je videti takole.

import glob

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

Namesto datoteke a.jpg lahko z dodanim argumentom pot dobite naslednjo datoteko.
./testdir/a.jpg

Uporabite lahko tudi nadomestne znake (*), da dobite samo določene razširitve, kot je prikazano spodaj.
glob.glob('./testdir/*.jpg')

Uporabite lahko naslednje ujemanje vzorcev.

  • *: Ujema se z vsem.
  • ?Ustreza kateremu koli posameznemu znaku.
  • [abc]: Ujema en sam znak iz znakov a, b ali c.
  • [!abc]: ustreza enemu znaku, ki ni znak a, b ali c

Preimenovanje z os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Preimenovanje datoteke ali imenika src v dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Uporabite funkcijo rename() modula os, ki ga bo preimenovala, kot nakazuje ime.

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

Nato se a.jpg preimenuje v a_000.jpg.

Ustvarjanje zaporednih številk z ničelno vrednostjo s funkcijo str.format()

Če na primer dodajamo zaporedne številke več deset datotekam, želimo uporabiti “00” ali “11” namesto “0” ali “1”. Če želite na ta način izpolniti ničle, uporabite metodo str.format().

str.format(args,*kwargs)
Izvaja operacije oblikovanja nizov. Niz, ki kliče to metodo, lahko vsebuje običajne znake ali nadomestna polja, ločena s {}.Built-in Types — Python 3.10.0 Documentation

Sintaksa nizov specifikacije formata
Oblikovni niz vsebuje “nadomestno polje”, zaprto v oglatih oklepajih {}.

Sintaksa polja za zamenjavo je naslednja:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Poenostavljeno povedano, nadomestno polje se začne z imenom_polja, zaradi česar se namesto nadomestnega polja oblikuje in v izhod vstavi vrednost določenega predmeta. Za imenom_polja lahko nadomestnemu polju sledi vzklikalnik '! Za imenom_polja lahko nadomestnemu polju sledi vzklikalnik '! Format_spec lahko zapišemo z dvopičjem ':' na koncu. Ta določa neprivzeto obliko vrednosti, ki jo je treba nadomestiti.
string — Common string operations — Python 3.10.0 Documentation

Če ga želite za zdaj napolniti z 0, naredite naslednje.

# 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

Primer kode za dodajanje niza in zaporedne številke pred datoteko

Najprej s funkcijo os.path.basename() pridobite ime datoteke. Nato pred ime datoteke dodajte niz ali zaporedno številko in jo združite z izvirno potjo s pomočjo os.path.join().

Naslednji primer doda img_ na začetek vseh imen datotek.

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

Rezultat je naslednji.

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

Če želite dodati zaporedne številke, spremenite stavek for v nekaj takega: enumerate(), da dobite številke, ki se štejejo po vrstnem redu od 0. V tem primeru je številka izpolnjena s tremi številkami.

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

Tukaj je rezultat.

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

Če želite začeti z 1 namesto z 0, nastavite drugi argument enumerate na 1.

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

To se glasi takole.

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

Primer kode za dodajanje niza zaporednih številk za datoteko

Uporabite os.path.splitext() za razdelitev datoteke na razširitev in korensko pot, nato pa korenski poti dodajte nize ali zaporedne številke. V naslednjem primeru se za vsemi imeni datotek doda _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)

Rezultat je naslednji.

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

Tako kot pri dodajanju zaporedne številke pred datoteko tudi pri dodajanju zaporedne številke spremenite stavek 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