- Canvieu el nom a granel mitjançant el mòdul os i el mòdul glob.
- Obteniu la llista de fitxers amb el mòdul glob
- Canvia el nom amb os.rename()
- Generació de nombres seqüencials plens de zero amb str.format()
- Exemple de codi per afegir una cadena/número seqüencial abans d’un fitxer
- Exemple de codi per afegir una cadena/número seqüencial després d’un fitxer
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