Dávková změna názvu souboru v jazyce Python přidáním řetězce nebo pořadového čísla před a za název souboru.

Podnikání

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