Přeskočit na obsah
Naše paměť

Chybějící skeny: jak najít mezery v řadě souborů

Jak ve stažených skenech najít mezery v číselné řadě a proč ani souvislé názvy souborů nepotvrzují úplnost knihy.

6 minut čtení

Po stažení snímků knihy chcete vědět, zda jste některý soubor nevynechali. Plná složka sama nic takového nepotvrzuje. Začněte kontrolou názvů a předem určeného rozsahu čísel. Výsledek pak porovnejte s nabídkou snímků a s obsahem knihy.

Tento postup hledá mezery v číselné řadě. Nekontroluje čitelnost obrázků ani to, zda různé soubory neobsahují tentýž snímek. Nalezená mezera je položka k dohledání, nikoli pokyn automaticky něco doplnit nebo přečíslovat.

Nejdřív zjistěte, co číslo označuje

Prohlédněte několik názvů a odpovídající snímky. Ověřte, zda číslo opravdu označuje pořadí snímku stejné knihy. Číslice mohou být také součástí signatury nebo data. Pokud názvy nemají jednoznačný tvar, nejprve připravte místní seznam vazeb mezi souborem a označením snímku. Nenechávejte model rozhodovat, které číslo měl autor názvu na mysli.

Rozsah kontroly určete nezávisle na obsahu složky. Pro zkušební řadu může být od 1 do 20, pro skutečnou knihu jej musíte zjistit z jejího zobrazení nebo jiného ověřeného seznamu. Kdybyste použili jen nejmenší a největší nalezené číslo, chybějící začátek či konec řady by zůstal mimo kontrolu.

O postupu při změně názvů pojednává hromadné přejmenování skenů. Tady názvy zachovejte. Přečíslováním souvislé řady byste původní mezeru zakryli a ztížili porovnání se zdrojem.

Počítání svěřte skriptu

Můžete model požádat o návrh programu, ale samotnou odpověď chatu nepoužívejte jako kontrolní součet. Potřebujete opakovatelný výpočet nad místním seznamem, jehož pravidla i výstup si ověříte. Skutečné názvy s údaji žijících do chatu neposílejte; k vysvětlení tvaru stačí smyšlené názvy.

Následující ukázka je pro Python 3. Neprochází podsložky a pracuje s názvy tvaru kniha_001.jpg. Číselná část smí mít jednu až šest číslic; počáteční nuly nemění její hodnotu. Povolené přípony jsou uvedeny v kódu a velikost písmen se nerozlišuje. Jiné názvy, adresáře a symbolické odkazy vypíše jako nezpracované. Nic nezapisuje, nepřejmenovává ani nestahuje.

Před spuštěním nastavte cestu ke zkušební složce a očekávaný rozsah. Pro jiný tvar názvů není ukázka bez úpravy vhodná. Změnu pravidla nejdřív znovu vyzkoušejte na známém vzorku.

from pathlib import Path
import re

adresar = Path("zkusebni_kopie")
prvni, posledni = 1, 20
if not (0 <= prvni <= posledni <= 999999):
    raise SystemExit("Rozsah musí být od 0 do 999999, začátek nejvýše konec.")
vzor = re.compile(r"kniha_([0-9]{1,6})\.(jpg|jpeg|png|tif|tiff)", re.I)
try:
    polozky = sorted(adresar.iterdir(), key=lambda p: p.name)
    cisla = {}
    for p in polozky:
        shoda = vzor.fullmatch(p.name)
        if p.is_symlink() or not p.is_file() or not shoda:
            print("Nezpracováno:", p.name)
            continue
        if p.stat().st_size == 0:
            print("Podezřelý soubor s nulovou velikostí:", p.name)
        n = int(shoda.group(1))
        cisla.setdefault(n, []).append(p.name)
except OSError as chyba:
    raise SystemExit(f"Složku nelze zkontrolovat: {chyba}")

if not cisla:
    raise SystemExit("Žádný odpovídající soubor. Úplnost nebyla posouzena.")
for n, nazvy in sorted(cisla.items()):
    if len(nazvy) > 1:
        print("Více souborů pro číslo", n, ":", ", ".join(nazvy))
    if not prvni <= n <= posledni:
        print("Mimo zadaný rozsah:", n)

cekane = prvni
mezery = False
for n in sorted(n for n in cisla if prvni <= n <= posledni) + [posledni + 1]:
    if n > cekane:
        konec = n - 1
        print("Chybí:", cekane if cekane == konec else f"{cekane}-{konec}")
        mezery = True
    cekane = n + 1
if not mezery:
    print("V zadaném rozsahu nejsou číselné mezery mezi rozpoznanými názvy.")
print("Kontrola názvů nepotvrzuje obsah ani úplnost knihy.")

Výpis uvádí chybějící číslo nebo uzavřený rozsah, například 7-9 znamená čísla 7, 8 a 9. Číslo 007 se ve výpisu zobrazí jako 7. Soubor s nulovou velikostí označí jako podezřelý, ale jeho číslo dál počítá jako přítomné. Hlášení o souvislé řadě tedy neruší toto varování. Více souborů se stejnou číselnou hodnotou ukázka hlásí zvlášť; nevybírá z nich správný obrázek. Každou položku „Nezpracováno“ prohlédněte, protože může patřit do jiné řady nebo mít odlišný název. Nevyvozujte z ní automaticky, že soubor s příslušným snímkem nemáte.

Zkouška se známým výsledkem

Vytvořte oddělenou zkušební složku a zkopírujte do ní malý souvislý výběr, u kterého znáte správné číslování. Ověřte cestu, názvy i rozsah v kódu. Nejprve spusťte kontrolu celé zkušební řady: nemá hlásit žádnou mezeru. Potom ze zkušební kopie přesuňte jeden soubor do jiné dočasné složky. Originálu se nedotýkejte.

Při rozsahu 1 až 20 a odebraném souboru kniha_007.jpg musí výpis obsahovat právě Chybí: 7. Stejně vyzkoušejte odebrání prvního a posledního snímku; očekávaný rozsah při tom neměňte. Tím zkontrolujete, že nástroj nehledá jen mezery uvnitř nalezeného seznamu.

Do zkušební složky přidejte soubor s nečíselným názvem. Musí být označen jako nezpracovaný. Zkouška prázdné složky nemá skončit ujištěním o úplnosti. Přidáte-li kopii pod názvem kniha_7.png vedle kniha_007.jpg, má zaznít upozornění na více souborů pro číslo 7. To není důvod některý z nich smazat. Porovnání názvů nerozhoduje o shodě obsahu.

Vyzkoušejte také prázdný soubor se správným názvem: musí se objevit varování o nulové velikosti a jeho číslo nesmí být současně hlášeno jako chybějící.

Pokud zkouška selže, nástroj na skutečnou sbírku nepoužívejte. Popište chybu nad smyšleným vzorkem a opravte pravidla. Úspěšná zkouška ověřuje dané případy; stále musíte přečíst upozornění ze skutečné složky.

Navazující postup najdete v oddílu „Jak provést důkladnou kontrolu úplnosti“ článku Když skeny stahuje pomocník; zde skript navíc určuje, kde v číselné řadě hledat mezeru.

Pro vlastní záznam kontroly si připravte sloupce „číslo k prověření“, „co ukázal výpis“, „co je u zdroje“ a „výsledek kontroly“. U každé nejasnosti rozlište, zda jste porovnali jen seznam souborů, nebo i obraz. Když podklad není dostupný, zapište „zatím neověřeno“. Není důvod mezeru vyplnit odhadem ani předpokládat její příčinu.

Číselná mezera a mezera v knize

Souvislá řada názvů nepotvrzuje ani stažení všeho, co je nabízeno, ani úplnost předlohy. Chybět může snímek mimo zadaný rozsah; jiný soubor může obsahovat chybný či opakovaný obrázek. Kontrola názvů obsah nečte. Každou nalezenou mezeru proto porovnejte s odpovídajícím místem v zobrazení knihy. Případné nové stažení ukládejte pod dosud nepoužitým názvem a původní soubor ponechte.

Po technické kontrole projděte návaznost viditelného číslování stran či listů. Skok z čísla 112 na 115 je podnět k prohlídce sousedních snímků a popisu svazku, sám neurčuje příčinu. Podobně změna roku nemusí znamenat chybějící list: kniha může být členěna do oddílů, například podle obcí. Nejprve zjistěte její uspořádání.

Práci s odkazy při přepisu vysvětluje index matriky do tabulky. Zde stačí držet odděleně název souboru, číslo snímku a označení stránky v knize. K nejasnosti si zapište sousední soubory a konkrétní místo k dohledání. Výsledkem je seznam zkontrolovaných mezer a otevřených otázek, nikoli prohlášení, že kniha určitě nic nepostrádá.

Psali: Ford Prefect · Hlubina myšlení

Článek napsal jazykový model a zkontroloval jej druhý model. Skript byl vyzkoušen na umělých souborech, nikoli na archivní knize.