Modificarea pe lot a numelui unui fișier în Python prin adăugarea unui șir de caractere sau a unui număr secvențial înainte și după numele fișierului

Afaceri

Redenumiți în bloc folosind modulul os și modulul glob.

Utilizați modulul os și modulul glob pentru a modifica și redenumi numele fișierelor dintr-un dosar în bloc, adăugând șiruri de caractere sau numere secvențiale înainte și după numele fișierelor.

Exemplu de structură a fișierelor

Să luăm ca exemplu următoarea structură de fișiere. În acest caz, se presupune că în dosar există numai fișiere (fără foldere).

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

Lucruri de care trebuie să țineți cont

Deoarece procesul implică redenumirea fișierului, salvați separat fișierul original, astfel încât acesta să poată fi salvat în caz de eșec.

Obțineți lista de fișiere cu modulul glob

Modulul glob va găsi toate numele de cale care se potrivesc cu modelul specificat în conformitate cu regulile utilizate de shell-ul Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

De exemplu, următoarea funcție poate fi utilizată pentru a obține o listă de nume de fișiere și directoare din directorul curent.
glob.glob('./*')
Argumentul poate fi o cale absolută sau o cale relativă.

În acest exemplu, ar arăta după cum urmează.

import glob

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

În loc de a.jpg, puteți obține următorul text, cu argumentul path adăugat.
./testdir/a.jpg

De asemenea, puteți utiliza caractere wildcard (*) pentru a obține numai anumite extensii, după cum se arată mai jos.
glob.glob('./testdir/*.jpg')

Se poate utiliza următoarea potrivire de tipare.

  • *: Se potrivește cu totul.
  • ?Se potrivește cu orice caracter unic.
  • [abc]: Potrivește un singur caracter din a, b sau c.
  • [!abc]: Se potrivește cu un singur caracter, altul decât a, b sau c

Redenumire cu os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Redenumește fișierul sau directorul src în dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Utilizați funcția rename() din modulul os, care îl va redenumi așa cum sugerează numele.

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

Apoi, a.jpg va fi redenumit în a_000.jpg.

Generarea de numere secvențiale completate cu zero cu str.format()

De exemplu, atunci când adăugăm numere secvențiale la zeci de fișiere, dorim să folosim „00” sau „11” în loc de „0” sau „1”. Dacă doriți să completați zerourile în acest mod, utilizați metoda str.format().

str.format(args,*kwargs)
Efectuează operații de formatare a șirurilor de caractere. Șirul care invocă această metodă poate conține caractere normale sau câmpuri de substituție separate prin {}.Built-in Types — Python 3.10.0 Documentation

Sintaxa șirurilor de caractere de specificare a formatului
Șirul de formatare conține „câmpul de înlocuire” încadrat între paranteze {}.

Sintaxa câmpului de înlocuire este următoarea:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

În termeni mai simpli, câmpul de înlocuire începe cu nume_câmp, ceea ce face ca valoarea obiectului specificat să fie formatată și inserată în ieșire în locul câmpului de înlocuire. După field_name, câmpul de conversie poate fi urmat de un semn de exclamare '! După field_name, câmpul de conversie poate fi urmat de un semn de exclamare '! Format_spec poate fi scris cu două puncte „:” la sfârșit. Acesta specifică formatul care nu este cel standard al valorii care urmează să fie înlocuită.
string — Common string operations — Python 3.10.0 Documentation

Dacă doriți să o umpleți cu 0 pentru moment, procedați după cum urmează.

# 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

Exemplu de cod pentru a adăuga un număr secvențial înaintea unui fișier

În primul rând, obțineți numele fișierului cu os.path.basename(). Apoi, adăugați un șir de caractere sau un număr secvențial în fața numelui de fișier și concatenați-l cu calea originală cu os.path.join().

Următorul exemplu adaugă img_ în fața tuturor numelor de fișiere.

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

Rezultatul este următorul.

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

Dacă doriți să adăugați numere secvențiale, schimbați instrucțiunea for în ceva de genul următor: enumerate() pentru a obține numerele numărate în ordine de la 0. În acest caz, numărul este completat cu trei cifre.

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

Iată rezultatul.

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

Dacă doriți să începeți cu 1 în loc de 0, setați al doilea argument al enumerării la 1.

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

Se întâmplă cam așa.

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

Exemplu de cod pentru a adăuga un număr secvențial după un fișier

Folosiți os.path.splitext() pentru a împărți fișierul în extensie și cale rădăcină, apoi adăugați șiruri de caractere sau numere secvențiale la calea rădăcină. În exemplul următor, _img este adăugat după toate numele de fișiere.

import os
import glob

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

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

Rezultatul este următorul.

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

Ca și în cazul adăugării unui număr secvențial înaintea unui fișier, modificați instrucțiunea for atunci când adăugați un număr secvențial.

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