- Omdöma i stor skala med hjälp av os-modulen och glob-modulen.
- Hämta fillistan med glob-modulen
- Byt namn med os.rename()
- Generera nollfyllda sekventiella nummer med str.format()
- Exempel på kod för att lägga till en sträng\följdenummer före en fil
- Exempel på kod för att lägga till ett strängföljdstal efter en fil
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