Batchändra ett filnamn i Python genom att lägga till en sträng eller ett sekventiellt nummer före och efter filnamnet.

Företag

Omdöma i stor skala med hjälp av os-modulen och glob-modulen.

Använd os-modulen och glob-modulen för att ändra och byta namn på filnamnen i en mapp i stor skala genom att lägga till strängar eller löpande nummer före och efter filnamnen.

Exempel på filstruktur

Ta följande filstruktur som exempel. I det här fallet antas det att det endast finns filer (inga mappar) i mappen.

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

Saker att tänka på

Eftersom processen innebär att filen byter namn ska du spara den ursprungliga filen separat så att den kan sparas i händelse av misslyckande.

Hämta fillistan med glob-modulen

Glob-modulen hittar alla sökvägar som matchar det angivna mönstret enligt de regler som används av Unix-skalet.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Följande funktion kan till exempel användas för att få en lista över fil- och katalognamn i den aktuella katalogen.
glob.glob('./*')
Argumentet kan vara en absolut sökväg eller en relativ sökväg.

I det här exemplet skulle det se ut på följande sätt.

import glob

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

Istället för a.jpg kan du få följande, med argumentet sökväg tillagt.
./testdir/a.jpg

Du kan också använda jokertecken (*) för att få fram specifika tillägg, som visas nedan.
glob.glob('./testdir/*.jpg')

Följande mönstermatchning kan användas.

  • *: Matchar allt.
  • ?Matchar alla enskilda tecken.
  • [abc]: Matchar ett enskilt tecken från a, b eller c.
  • [!abc]: Matchar ett enda tecken som inte är a, b eller c.

Byt namn med os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Byt namn på filen eller katalogen src till dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Använd funktionen rename() i modulen os, som byter namn på den som namnet antyder.

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

Då kommer a.jpg att byta namn till a_000.jpg.

Generera nollfyllda sekventiella nummer med str.format()

När vi till exempel lägger till löpande nummer till dussintals filer vill vi använda ”00” eller ”11” i stället för ”0” eller ”1”. Om du vill fylla i nollorna på det här sättet använder du metoden str.format().

str.format(args,*kwargs)
Utför formatering av strängar. Strängen som anropar den här metoden kan innehålla normala tecken eller ersättningsfält som separeras med {}.Built-in Types — Python 3.10.0 Documentation

Syntax för formatspecifikationssträngar
Formateringssträngen innehåller ”ersättningsfältet” inom parenteser {}.

Syntaxen för ersättningsfältet är följande:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Enkelt uttryckt börjar ersättningsfältet med field_name, vilket gör att värdet av det angivna objektet formateras och infogas i utdata i stället för ersättningsfältet. Efter field_name kan konverteringsfältet följas av ett utropstecken '! Efter field_name kan konverteringsfältet följas av ett utropstecken '! Format_spec kan skrivas med ett kolon ':' i slutet. Detta anger det icke-standardiserade formatet för det värde som ska ersättas.
string — Common string operations — Python 3.10.0 Documentation

Om du vill fylla den med 0 för tillfället gör du så här.

# 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

Exempel på kod för att lägga till en sträng\följdenummer före en fil

Först tar du fram filnamnet med os.path.basename(). Lägg sedan till en sträng eller ett löpnummer framför filnamnet och sammanfoga det med den ursprungliga sökvägen med os.path.join().

I följande exempel läggs img_ till framför alla filnamn.

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

Resultatet är följande.

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

Om du vill lägga till löpande nummer ändrar du for-angivelsen till något som liknar detta: enumerate() för att få numren räknade i ordning från 0. I det här fallet fylls numret med tre siffror.

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

Här är resultatet.

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

Om du vill börja med 1 i stället för 0 anger du 1 som andra argument för enumerate.

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

Det går till så här.

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

Exempel på kod för att lägga till ett strängföljdstal efter en fil

Använd os.path.splitext() för att dela upp filen i ett tillägg och en rotväg och lägg sedan till strängar eller löpnummer i rotvägen. I följande exempel läggs _img till efter alla filnamn.

import os
import glob

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

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

Resultatet är följande.

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

På samma sätt som när du lägger till ett string\sekventialnummer före en fil ändrar du for-angivelsen när du lägger till ett sekventiellt nummer.

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