- Hromadné přejmenování pomocí modulu os a modulu glob.
- Získání seznamu souborů pomocí modulu glob
- Přejmenování pomocí os.rename()
- Generování pořadových čísel vyplněných nulou pomocí funkce str.format()
- Příklad kódu pro přidání řetězce\následného čísla před soubor
- Příklad kódu pro přidání řetězce\následného čísla za soubor
Hromadné přejmenování pomocí modulu os a modulu glob.
Modul os a modul glob slouží k hromadné změně a přejmenování názvů souborů ve složce přidáním řetězců nebo pořadových čísel před a za názvy souborů.
Příklad struktury souboru
Jako příklad uveďme následující strukturu souborů. V tomto případě se předpokládá, že ve složce jsou pouze soubory (žádné složky).
. └── testdir ├── a.jpg ├── b.jpg ├── c.jpg ├── d.jpg └── e.jpg
Co je třeba mít na paměti
Vzhledem k tomu, že proces zahrnuje přejmenování souboru, uložte původní soubor zvlášť, abyste jej mohli zachránit v případě selhání.
Získání seznamu souborů pomocí modulu glob
Modul glob vyhledá všechny názvy cest, které odpovídají zadanému vzoru podle pravidel používaných v unixovém shellu.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation
Následující funkci lze například použít k získání seznamu názvů souborů a adresářů v aktuálním adresáři.glob.glob('./*')
Argumentem může být absolutní nebo relativní cesta.
V tomto příkladu by to vypadalo následovně.
import glob print(glob.glob('./testdir/*')) # => ['./testdir/a.jpg', './testdir/b.jpg', './testdir/c.jpg', './testdir/d.jpg', './testdir/e.jpg']
Místo souboru a.jpg můžete získat následující soubor s přidaným argumentem cesta../testdir/a.jpg
Můžete také použít zástupné znaky (*) a získat pouze konkrétní přípony, jak je uvedeno níže.glob.glob('./testdir/*.jpg')
Lze použít následující porovnávání vzorů.
*
: Odpovídá všemu.?
Shoduje se s libovolným jednotlivým znakem.[abc]
: Shoduje se s jedním znakem z a, b nebo c.[!abc]
: Odpovídá jednomu znaku jinému než a, b nebo c.
Přejmenování pomocí os.rename()
os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Přejmenování souboru nebo adresáře src na dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Použijte funkci rename() modulu os, která jej přejmenuje podle názvu.
import os os.rename('./testdir/a.jpg', './testdir/a_000.jpg')
Pak se soubor a.jpg přejmenuje na a_000.jpg.
Generování pořadových čísel vyplněných nulou pomocí funkce str.format()
Například při přidávání pořadových čísel do desítek souborů chceme použít „00“ nebo „11“ místo „0“ nebo „1“. Pokud chcete tímto způsobem doplnit nuly, použijte metodu str.format().
str.format(args,*kwargs)
Provádí operace formátování řetězců. Řetězec, který tuto metodu vyvolává, může obsahovat normální znaky nebo substituční pole oddělená {}.Built-in Types — Python 3.10.0 Documentation
Syntaxe řetězců specifikace formátu
Formátovací řetězec obsahuje „náhradní pole“ uzavřené ve složených závorkách {}.Syntaxe pole pro nahrazení je následující:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
Zjednodušeně řečeno, náhradní pole začíná jménem_pole, což způsobí, že se místo náhradního pole zformátuje a do výstupu vloží hodnota zadaného objektu. Za názvem_pole může následovat vykřičník '! Za názvem_pole může následovat vykřičník '! Za formát_spec lze zapsat dvojtečku ':' na konci. Tím se specifikuje jiný než výchozí formát nahrazované hodnoty.
string — Common string operations — Python 3.10.0 Documentation
Pokud ji chcete prozatím vyplnit hodnotou 0, postupujte takto.
# 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
Příklad kódu pro přidání řetězce\následného čísla před soubor
Nejprve získáme název souboru pomocí funkce os.path.basename(). Poté před název souboru přidejte řetězec nebo pořadové číslo a spojte je s původní cestou pomocí os.path.join().
Následující příklad přidá img_ na začátek všech názvů souborů.
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)))
Výsledek je následující.
. └── testdir ├── img_a.jpg ├── img_b.jpg ├── img_c.jpg ├── img_d.jpg └── img_e.jpg
Pokud chcete přidávat po sobě jdoucí čísla, změňte příkaz for na něco takového: enumerate(), aby se čísla počítala v pořadí od 0. V tomto případě je číslo vyplněno třemi číslicemi.
for i, f in enumerate(files): os.rename(f, os.path.join(path, '{0:03d}'.format(i) + '_' + os.path.basename(f)))
Zde je výsledek.
. └── testdir ├── 000_a.jpg ├── 001_b.jpg ├── 002_c.jpg ├── 003_d.jpg └── 004_e.jpg
Pokud chcete začít s hodnotou 1 místo 0, nastavte druhý argument enumerate na 1.
for i, f in enumerate(files, 1): os.rename(f, os.path.join(path, '{0:03d}'.format(i) + '_' + os.path.basename(f)))
Je to takto.
. └── testdir ├── 001_a.jpg ├── 002_b.jpg ├── 003_c.jpg ├── 004_d.jpg └── 005_e.jpg
Příklad kódu pro přidání řetězce\následného čísla za soubor
Pomocí funkce os.path.splitext() rozdělíte soubor na příponu a kořenovou cestu a do kořenové cesty přidáte řetězce nebo pořadová čísla. V následujícím příkladu je za všechny názvy souborů přidáno _img.
import os import glob files = glob.glob('./testdir/*') for f in files: ftitle, fext = os.path.splitext(f) os.rename(f, ftitle + '_img' + fext)
Výsledek je následující.
. └── testdir ├── a_img.jpg ├── b_img.jpg ├── c_img.jpg ├── d_img.jpg └── e_img.jpg
Stejně jako při přidávání řetězce\sekvenčního čísla před soubor změňte příkaz for při přidávání sekvenčního čísla.
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