Canvieu per lots un nom de fitxer a Python afegint una cadena o un número seqüencial abans i després del nom del fitxer

Negocis

Canvieu el nom a granel mitjançant el mòdul os i el mòdul glob.

Utilitzeu el mòdul os i el mòdul glob per canviar i canviar el nom dels noms dels fitxers d’una carpeta a granel afegint cadenes o números seqüencials abans i després dels noms dels fitxers.

Exemple d’estructura de fitxers

Preneu com a exemple l’estructura de fitxers següent. En aquest cas, se suposa que només hi ha fitxers (sense carpetes) a la carpeta.

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

Coses a tenir en compte

Com que el procés implica canviar el nom del fitxer, deseu el fitxer original per separat perquè es pugui desar en cas d’error.

Obteniu la llista de fitxers amb el mòdul glob

El mòdul glob trobarà tots els noms de camí que coincideixin amb el patró especificat segons les regles utilitzades per l’intèrpret d’ordres Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Per exemple, la funció següent es pot utilitzar per obtenir una llista de noms de fitxers i directoris al directori actual.
glob.glob('./*')
L’argument pot ser un camí absolut o un camí relatiu.

En aquest exemple, es veuria com el següent.

import glob

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

En lloc d’a.jpg, podeu obtenir el següent, amb el camí de l’argument afegit.
./testdir/a.jpg

També podeu utilitzar els comodins (*) per obtenir només extensions específiques, tal com es mostra a continuació.
glob.glob('./testdir/*.jpg')

Es pot utilitzar la següent concordança de patrons.

  • *: Coincideix amb tot.
  • ?Coincideix amb qualsevol caràcter.
  • [abc]: Coincideix amb un sol caràcter de a, b o c.
  • [!abc]: Coincideix amb un únic caràcter que no sigui a, b o c

Canvia el nom amb os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Canvieu el nom del fitxer o directori src a dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Utilitzeu la funció rename() del mòdul del sistema operatiu, que el canviarà com el nom indica.

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

Aleshores, a.jpg es canviarà el nom a a_000.jpg.

Generació de nombres seqüencials plens de zero amb str.format()

Per exemple, quan afegim números seqüencials a desenes de fitxers, volem utilitzar “00” o “11” en comptes de “0” o “1”. Si voleu omplir els zeros d’aquesta manera, utilitzeu el mètode str.format().

str.format(args,*kwargs)
Realitza operacions de format de cadena. La cadena que invoca aquest mètode pot contenir caràcters normals o camps de substitució separats per {}.Built-in Types — Python 3.10.0 Documentation

Sintaxi de les cadenes d’especificació de format
La cadena de format conté el “camp de substitució” inclòs entre claudàtors {}.

La sintaxi del camp de substitució és la següent:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

En termes més senzills, el camp de substitució comença amb nom_camp, la qual cosa fa que el valor de l’objecte especificat sigui formatat i inserit a la sortida en lloc del camp de substitució. Després de field_name, el camp de conversió pot anar seguit d’un signe d’exclamació ‘! Després de field_name, el camp de conversió pot anar seguit d’un signe d’exclamació ‘! El format_spec es pot escriure amb dos punts ‘:’ al final. Això especifica el format no predeterminat del valor que s’ha de substituir.
string — Common string operations — Python 3.10.0 Documentation

Si voleu omplir-lo amb 0 de moment, feu el següent.

# 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

Exemple de codi per afegir una cadena/número seqüencial abans d’un fitxer

Primer, obteniu el nom del fitxer amb os.path.basename(). A continuació, afegiu una cadena o un número seqüencial davant del nom del fitxer i concateneu-lo amb el camí original amb os.path.join().

L’exemple següent afegeix img_ al davant de tots els noms de fitxer.

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

El resultat és el següent.

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

Si voleu afegir números seqüencials, canvieu la instrucció for a una cosa com aquesta: enumerate() per obtenir els nombres comptats en ordre des de 0. En aquest cas, el nombre s’omple amb tres dígits.

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

Aquí teniu el resultat.

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

Si voleu començar amb 1 en lloc de 0, establiu el segon argument d’enumeració a 1.

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

Va així.

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

Exemple de codi per afegir una cadena/número seqüencial després d’un fitxer

Utilitzeu os.path.splitext() per dividir el fitxer en extensió i ruta arrel, i després afegiu cadenes o números seqüencials a la ruta arrel. A l’exemple següent, s’afegeix _img després de tots els noms de fitxer.

import os
import glob

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

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

El resultat és aquest.

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

Igual que amb l’addició d’una cadena/número seqüencial abans d’un fitxer, canvieu la instrucció for quan afegiu un número seqüencial.

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