fileinput
— Iterera över rader från flera inmatningsströmmar¶
Källkod: Lib/fileinput.py
Denna modul implementerar en hjälpklass och funktioner för att snabbt skriva en loop över standardinmatning eller en lista med filer. Om du bara vill läsa eller skriva en fil, se open()
.
Den typiska användningen är:
import fileinput
for line in fileinput.input(encoding="utf-8"):
process(line)
Detta itererar över raderna i alla filer som listas i sys.argv[1:]
, med sys.stdin
som standard om listan är tom. Om ett filnamn är '-'
ersätts det också av sys.stdin
och de valfria argumenten mode och openhook ignoreras. För att ange en alternativ lista med filnamn, skicka den som första argument till input()
. Ett enda filnamn är också tillåtet.
Alla filer öppnas i textläge som standard, men du kan åsidosätta detta genom att ange parametern mode i anropet till input()
eller FileInput
. Om ett I/O-fel inträffar under öppning eller läsning av en fil genereras OSError
.
Om sys.stdin
används mer än en gång, kommer den andra och ytterligare användningen inte att returnera några rader, utom kanske för interaktiv användning, eller om den uttryckligen har återställts (t.ex. med sys.stdin.seek(0)
).
Tomma filer öppnas och stängs omedelbart; den enda gången deras närvaro i listan över filnamn märks är när den senast öppnade filen är tom.
Raderna returneras med eventuella nya rader intakta, vilket innebär att den sista raden i en fil kanske inte har någon ny rad.
Du kan styra hur filer öppnas genom att tillhandahålla en öppnings-hook via parametern openhook till fileinput.input()
eller FileInput()
. Hooken måste vara en funktion som tar två argument, filnamn och mode, och returnerar ett filliknande objekt som öppnats på motsvarande sätt. Om encoding och/eller errors anges kommer de att skickas till hooken som ytterligare nyckelordsargument. Denna modul tillhandahåller en hook_compressed()
för att stödja komprimerade filer.
Följande funktion är det primära gränssnittet för denna modul:
- fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)¶
Skapa en instans av
FileInput
-klassen. Instansen kommer att användas som globalt tillstånd för funktionerna i denna modul och returneras också för att användas under iteration. Parametrarna till denna funktion kommer att skickas vidare till konstruktören för klassenFileInput
.Instansen
FileInput
kan användas som kontexthanterare iwith
-satsen. I det här exemplet stängs input efter attwith
-satsen har avslutats, även om ett undantag inträffar:with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f: for line in f: process(line)
Ändrad i version 3.2: Kan användas som en kontexthanterare.
Ändrad i version 3.8: Nyckelordsparametrarna mode och openhook är nu endast nyckelord.
Ändrad i version 3.10: Parametrarna encoding och errors, som endast är nyckelord, har lagts till.
Följande funktioner använder det globala tillstånd som skapats av fileinput.input()
; om det inte finns något aktivt tillstånd, uppstår RuntimeError
.
- fileinput.filename()¶
Returnerar namnet på den fil som läses för närvarande. Returnerar
None
innan den första raden har lästs.
- fileinput.fileno()¶
Returnerar heltalet ”file descriptor” för den aktuella filen. När ingen fil öppnas (före första raden och mellan filer) returneras
-1
.
- fileinput.lineno()¶
Returnerar det kumulativa radnumret för den rad som just har lästs. Innan den första raden har lästs, returnerar
0
. Efter att den sista raden i den sista filen har lästs, returneras radnumret för den raden.
- fileinput.filelineno()¶
Returnerar radnumret i den aktuella filen. Innan den första raden har lästs, returneras
0
. Efter att den sista raden i den sista filen har lästs, returneras radnumret för den raden i filen.
- fileinput.isfirstline()¶
Returnerar
True
om den just lästa raden är den första raden i filen, annars returnerasFalse
.
- fileinput.isstdin()¶
Returnerar
True
om den sista raden lästes frånsys.stdin
, annars returnerasFalse
.
- fileinput.nextfile()¶
Stäng den aktuella filen så att nästa iteration läser den första raden från nästa fil (om någon); rader som inte läses från filen räknas inte in i det kumulativa radantalet. Filnamnet ändras inte förrän efter att första raden i nästa fil har lästs. Innan den första raden har lästs har denna funktion ingen effekt; den kan inte användas för att hoppa över den första filen. När den sista raden i den sista filen har lästs har denna funktion ingen effekt.
- fileinput.close()¶
Stäng sekvensen.
Klassen som implementerar det sekvensbeteende som tillhandahålls av modulen är också tillgänglig för underklassning:
- class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)¶
Klassen
FileInput
är implementationen; dess metoderfilename()
,fileno()
,lineno()
,filelineno()
,isfirstline()
,isstdin()
,nextfile()
ochclose()
motsvarar funktionerna med samma namn i modulen. Dessutom är den iterable och har enreadline()
-metod som returnerar nästa inmatningsrad. Tillgången till sekvensen måste ske i strikt sekventiell ordning; slumpmässig tillgång ochreadline()
kan inte blandas.Med mode kan du ange vilket filläge som ska skickas till
open()
. Det måste vara ett av'r'
och'rb'
.När openhook ges måste det vara en funktion som tar två argument, filnamn och mode, och returnerar ett filliknande objekt som öppnats på motsvarande sätt. Du kan inte använda inplace och openhook tillsammans.
Du kan ange kodning och fel som skickas till
open()
eller openhook.En instans av
FileInput
kan användas som kontexthanterare iwith
-satsen. I det här exemplet stängs input efter attwith
-satsen har avslutats, även om ett undantag inträffar:med FileInput(files=('spam.txt', 'eggs.txt')) som input: process(input)
Ändrad i version 3.2: Kan användas som en kontexthanterare.
Ändrad i version 3.8: Nyckelordsparametrarna mode och openhook är nu endast nyckelord.
Ändrad i version 3.10: Parametrarna encoding och errors, som endast är nyckelord, har lagts till.
Ändrad i version 3.11: Lägena
'rU'
och'U'
samt metoden__getitem__()
har tagits bort.
Valfri in-place-filtrering: Om nyckelordsargumentet inplace=True
skickas till fileinput.input()
eller till FileInput
-konstruktören, flyttas filen till en backup-fil och standardutdata riktas till inmatningsfilen (om en fil med samma namn som backup-filen redan finns, kommer den att ersättas tyst). Detta gör det möjligt att skriva ett filter som skriver om sin indatafil på plats. Om parametern backup anges (vanligtvis som backup='.<some extension>'
), anger den filändelse för backupfilen och backupfilen finns kvar; som standard är filändelsen '.bak'
och den raderas när utdatafilen stängs. Filtrering på plats inaktiveras när standardinmatning läses.
De två följande öppnings-hooks tillhandahålls av denna modul:
- fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None)¶
Öppnar filer som komprimerats med gzip och bzip2 (känns igen på tillägget
'.gz'
och'.bz2'
) med hjälp av modulernagzip
ochbz2
. Om filnamnstillägget inte är'.gz'
eller'.bz2'
öppnas filen normalt (dvs. medopen()
utan någon dekomprimering).Värdena encoding och errors skickas till
io.TextIOWrapper
för komprimerade filer och open för vanliga filer.Användningsexempel:
fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")
Ändrad i version 3.10: Parametrarna encoding och errors, som endast är nyckelord, har lagts till.
- fileinput.hook_encoded(encoding, errors=None)¶
Returnerar en hook som öppnar varje fil med
open()
, och använder den angivna kodningen och fel för att läsa filen.Användningsexempel:
fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))
Ändrad i version 3.6: Lagt till den valfria parametern errors.
Föråldrad sedan version 3.10: Denna funktion är borttagen eftersom
fileinput.input()
ochFileInput
nu har parametrarna encoding och errors.