Klasická funkce open()
otevírá přístup právě k jednomu fyzickému souboru, ať už textovému či binárnímu. Knihovní funkce fileinput.input()
je jejím velmi výrazným zobecněním (převážně pro čtení dat, ale viz parametr inplace), protože umožňuje:
Navíc dokáže automaticky zpracovat soubory komprimované pomocí gzip (přípona .gz) a bzip2 (přípona .bz2), jakož i poradit si s chybami v kódování.
Kromě toho je solidně konfigurovatelná a je možno si dopsat vlastní handlery pro další typy souborů.
V úplně nejjednodušší podobě stačí napsat:
Blíže neurčený vstup je pak zpracován následujícím způsobem:
sys.argv[1:]
), jsou postupně čteny řádku po řádce jedem po druhém;
'-'
– žádné soubory, jsou řádky načítány ze standardního vstupu sys.stdin
(tedy z pajpy).
Výchozí nastavení je stejné jako u funkce open(), tj. textové soubory pro čtení ('r'), přičemž jediný další povolený způsob je binární soubor pro čtení ('rb'). Nicméně je možné otevřené soubory přepisovat, případně ukládat záložní kopie.
Plný konstruktor funkce input() odhaluje, že toho lze nastavit mnohem více:
fileinput.input(files=None, inplace=False, backup='', mode='r', openhook=None)
Především tedy můžete:
K dispozici jsou dva připravené openhooky:
fileinput.hook_compressed
dokáže otevřít soubory zkomprimované pomocí metod gzip (pouze přípona .gz!), respektive bzip2 (pouze přípona .bz2!);
fileinput.hook_encoded
předepisuje kódování pro otevírané textové soubory a způsob řešení chyb při jejich dekódování zadaným algoritmem.
Kromě těchto dvou předpřipravených je možno si napsat vlastní. Jedná se totiž o funkce, které přebírají právě dva vstupní parametry – jméno/cestu k souboru a způsob jeho otevření (tedy 'r'/'rb') – a mají za úkol vrátit příslušným způsobem otevřený tento soubor.
Jelikož primárním účelem modulu fileinput je načítání vícero proudů najednou, nepřekvapí, že máme k dispozici funkce, které nám v načítaných souborech pomohou udělat trochu pořádek:
filename()
a fileno()
vrací jméno a „celočíselný deskriptor“ právě zpracovávaného souboru;
filelineno()
, resp. lineno()
vrací pořadové číslo řádky v aktuálním souboru, resp. akumulovaně přes všechny dosud načtené řádky ze všech již zpracovaných souborů;
isfirstline()
vrací True, pokud právě zpracovávaná řádka je první řádkou aktuálního souboru;
isstdin()
vrací True jen a pouze v tom případě, kdy poslední načtená řádka pochází ze sys.stdin;
nextfile()
uzavírá aktuální otevřený proud a přechází na další (případné nedočtené řádky se do celkových nepřekvapivě nezapočítávají);
close()
uzavírá kontext (nezávisle na tom, zda byl již vyčerpán nebo ne).