io
— Kärnverktyg för att arbeta med strömmar¶
Källkod: Lib/io.py
Översikt¶
Modulen io
tillhandahåller Pythons viktigaste funktioner för att hantera olika typer av I/O. Det finns tre huvudtyper av I/O: text-I/O, binär-I/O och raw-I/O. Dessa är generiska kategorier, och olika backing stores kan användas för var och en av dem. Ett konkret objekt som tillhör någon av dessa kategorier kallas för ett filobjekt. Andra vanliga termer är stream och filliknande objekt.
Oberoende av sin kategori kommer varje konkret strömobjekt också att ha olika funktioner: det kan vara skrivskyddat, skrivskyddat eller skrivskyddat. Det kan också tillåta godtycklig slumpmässig åtkomst (sökning framåt eller bakåt till valfri plats), eller endast sekventiell åtkomst (till exempel i fallet med en socket eller pipe).
Alla strömmar är försiktiga med vilken typ av data du ger till dem. Om du till exempel ger ett str
-objekt till write()
-metoden för en binär ström kommer ett TypeError
att uppstå. Detsamma gäller om man ger ett bytes
-objekt till write()
-metoden för en textström.
Ändrad i version 3.3: Operationer som tidigare gav upphov till IOError
ger nu upphov till OSError
, eftersom IOError
nu är ett alias för OSError
.
Text I/O¶
Text-I/O förväntar sig och producerar str
-objekt. Detta innebär att när backing-lagret är uppbyggt av bytes (som i fallet med en fil), sker kodning och avkodning av data på ett transparent sätt, liksom valfri översättning av plattformsspecifika newline-tecken.
Det enklaste sättet att skapa en textström är med open()
, med möjlighet att ange en kodning:
f = open("myfile.txt", "r", encoding="utf-8")
Textflöden i minnet finns också tillgängliga som StringIO
-objekt:
f = io.StringIO("några inledande textdata")
Anteckning
När du arbetar med en icke-blockerande ström bör du vara medveten om att läsoperationer på text-I/O-objekt kan ge upphov till ett BlockingIOError
om strömmen inte kan utföra operationen omedelbart.
API:et för textströmmar beskrivs i detalj i dokumentationen för TextIOBase
.
Binär I/O¶
Binär I/O (även kallad buffrad I/O) förväntar sig bytesliknande objekt och producerar bytes
-objekt. Ingen kodning, avkodning eller översättning av nya rader utförs. Denna kategori av strömmar kan användas för alla typer av data som inte är textdata och även när manuell kontroll över hanteringen av textdata önskas.
Det enklaste sättet att skapa en binär ström är med open()
med 'b'
i läget string:
f = open("minfil.jpg", "rb")
Binära strömmar i minnet finns också tillgängliga som BytesIO
-objekt:
f = io.BytesIO(b"några inledande binära data: \x00\x01")
API:et för binära strömmar beskrivs i detalj i dokumentationen för BufferedIOBase
.
Andra biblioteksmoduler kan tillhandahålla ytterligare sätt att skapa text- eller binärströmmar. Se socket.socket.makefile()
för exempel.
Rå I/O¶
Raw I/O (även kallat obuffrad I/O) används i allmänhet som en lågnivåbyggsten för binära strömmar och textströmmar; det är sällan användbart att direkt manipulera en raw stream från användarkod. Du kan dock skapa en rå ström genom att öppna en fil i binärt läge med buffring inaktiverad:
f = open("myfile.jpg", "rb", buffring=0)
API:et för råa strömmar beskrivs i detalj i dokumentationen för RawIOBase
.
Teckenuppsättning¶
Standardkodningen för TextIOWrapper
och open()
är lokalspecifik (locale.getencoding()
).
Många utvecklare glömmer dock att ange kodningen när de öppnar textfiler som är kodade i UTF-8 (t.ex. JSON, TOML, Markdown, etc…) eftersom de flesta Unix-plattformar använder UTF-8 locale som standard. Detta orsakar buggar eftersom lokalkodningen inte är UTF-8 för de flesta Windows-användare. Till exempel:
# Fungerar kanske inte på Windows om det finns icke-ASCII-tecken i filen.
med open("README.md") som f:
long_description = f.read()
Därför rekommenderar vi starkt att du anger kodningen explicit när du öppnar textfiler. Om du vill använda UTF-8, skicka encoding="utf-8"
. För att använda den aktuella locale-kodningen stöds encoding="locale"
sedan Python 3.10.
Se även
- Python UTF-8-läge
Python UTF-8 Mode kan användas för att ändra standardkodningen till UTF-8 från lokalspecifik kodning.
- PEP 686
Python 3.15 kommer att göra Python UTF-8-läge till standard.
Opt-in-kodningVarning¶
Tillagd i version 3.10: Se PEP 597 för mer information.
Om du vill veta var standardkodningen för lokala används kan du aktivera kommandoradsalternativet -X warn_default_encoding
eller ange miljövariabeln PYTHONWARNDEFAULTENCODING
, som skickar ut en EncodingWarning
när standardkodningen används.
Om du tillhandahåller ett API som använder open()
eller TextIOWrapper
och skickar encoding=None
som en parameter, kan du använda text_encoding()
så att anropare av API:et skickar en EncodingWarning
om de inte skickar en encoding
. Överväg dock att använda UTF-8 som standard (d.v.s. encoding="utf-8"
) för nya API:er.
Modulgränssnitt på hög nivå¶
- io.DEFAULT_BUFFER_SIZE¶
Ett int som innehåller den standardbuffertstorlek som används av modulens buffrade I/O-klasser.
open()
använder filens blksize (som erhålls avos.stat()
) om möjligt.
- io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶
Detta är ett alias för den inbyggda funktionen
open()
.Denna funktion genererar en auditing event
open
med argumenten path, mode och flags. Argumenten mode och flags kan ha modifierats eller härleds från det ursprungliga anropet.
- io.open_code(path)¶
Öppnar den angivna filen med läget
'rb'
. Denna funktion bör användas när avsikten är att behandla innehållet som körbar kod.path ska vara en
str
och en absolut sökväg.Den här funktionens beteende kan åsidosättas av ett tidigare anrop till
PyFile_SetOpenCodeHook()
. Men om man antar att path är enstr
och en absolut sökväg, böropen_code(path)
alltid bete sig på samma sätt somopen(path, 'rb')
. Åsidosättande av beteendet är avsett för ytterligare validering eller förbehandling av filen.Tillagd i version 3.8.
- io.text_encoding(encoding, stacklevel=2, /)¶
Detta är en hjälpfunktion för anropsbara filer som använder
open()
ellerTextIOWrapper
och som har enencoding=None
parameter.Denna funktion returnerar encoding om den inte är
None
. Annars returnerar den"locale"
eller"utf-8"
beroende på UTF-8 Mode.Denna funktion skickar ut en
EncodingWarning
omsys.flags.warn_default_encoding
är true och encoding ärNone
. stacklevel anger varifrån varningen skickas. Till exempel:def läs_text(sökväg, kodning=None): encoding = io.text_encoding(encoding) # stacklevel=2 med open(sökväg, kodning) som f: return f.read()
I det här exemplet skickas en
EncodingWarning
ut till den som anroparread_text()
.Se Teckenuppsättning för mer information.
Tillagd i version 3.10.
Ändrad i version 3.11:
text_encoding()
returnerar ”utf-8” när UTF-8-läget är aktiverat och encoding ärNone
.
- exception io.BlockingIOError¶
Detta är ett kompatibilitetsalias för det inbyggda undantaget
BlockingIOError
.
- exception io.UnsupportedOperation¶
Ett undantag som ärver
OSError
ochValueError
och som uppstår när en operation som inte stöds anropas på en stream.
Se även
sys
innehåller de vanliga IO-strömmarna:
sys.stdin
,sys.stdout
ochsys.stderr
.
Klasshierarki¶
Implementeringen av I/O-strömmar är organiserad som en hierarki av klasser. Först abstrakta basklasser (ABC), som används för att specificera de olika kategorierna av strömmar, sedan konkreta klasser som tillhandahåller standardimplementeringarna av strömmar.
Anteckning
De abstrakta basklasserna tillhandahåller också standardimplementeringar av vissa metoder för att underlätta implementeringen av konkreta strömklasser. Till exempel ger BufferedIOBase
ooptimerade implementationer av readinto()
och readline()
.
Överst i I/O-hierarkin finns den abstrakta basklassen IOBase
. Den definierar det grundläggande gränssnittet till en stream. Observera dock att det inte finns någon åtskillnad mellan att läsa och skriva till strömmar; implementationer får höja UnsupportedOperation
om de inte stöder en viss operation.
ABC:n RawIOBase
utökar IOBase
. Den hanterar läsning och skrivning av bytes till en ström. FileIO
subklassar RawIOBase
för att tillhandahålla ett gränssnitt till filer i maskinens filsystem.
ABC för BufferedIOBase
utökar IOBase
. Den hanterar buffring på en rå binär ström (RawIOBase
). Dess underklasser BufferedWriter
, BufferedReader
och BufferedRWPair
buffrar råa binära strömmar som är skrivbara, läsbara respektive både läsbara och skrivbara. BufferedRandom
ger ett buffrat gränssnitt till sökbara strömmar. En annan underklass till BufferedIOBase
, BytesIO
, är en ström av bytes i minnet.
ABC:s TextIOBase
utökar IOBase
. Den hanterar strömmar vars bytes representerar text och hanterar kodning och avkodning till och från strängar. TextIOWrapper
, som utökar TextIOBase
, är ett buffrat textgränssnitt till en buffrad råström (BufferedIOBase
). Slutligen är StringIO
en minnesbaserad ström för text.
Argumentnamn är inte en del av specifikationen, och endast argumenten i open()
är avsedda att användas som nyckelordsargument.
I följande tabell sammanfattas de ABC-kunskaper som tillhandahålls av modulen io
:
ABC |
Ärver |
Stubbmetoder |
Mixin-metoder och -egenskaper |
---|---|---|---|
|
|
||
”läsa in i” och ”skriva in i |
Ärvde |
||
|
Ärvda |
||
|
Ärvde |
I/O-basklasser¶
- class io.IOBase¶
Den abstrakta basklassen för alla I/O-klasser.
Denna klass tillhandahåller tomma abstrakta implementeringar för många metoder som härledda klasser kan åsidosätta selektivt; standardimplementeringarna representerar en fil som inte kan läsas, skrivas eller sökas.
Även om
IOBase
inte deklarerarread()
ellerwrite()
eftersom deras signaturer kommer att variera, bör implementationer och klienter betrakta dessa metoder som en del av gränssnittet. Implementationer kan också ge upphov till ettValueError
(ellerUnsupportedOperation
) när operationer som de inte stöder anropas.Den grundläggande typen som används för binära data som läses från eller skrivs till en fil är
bytes
. Andra bytes-liknande objekt accepteras också som metodargument. Text-I/O-klasser arbetar medstr
-data.Observera att anrop av någon metod (även förfrågningar) på en stängd ström är odefinierat. Implementationer kan ge upphov till
ValueError
i detta fall.IOBase
(och dess underklasser) stöder iteratorprotokollet, vilket innebär att ettIOBase
-objekt kan itereras över, vilket ger raderna i en ström. Rader definieras något olika beroende på om strömmen är en binär ström (ger bytes) eller en textström (ger teckensträngar). Sereadline()
nedan.IOBase
är också en kontexthanterare och stöder därförwith
-satsen. I det här exemplet stängs fil efter attwith
-satsens svit är klar - även om ett undantag inträffar:med open('spam.txt', 'w') som fil: file.write("Skräppost och ägg!")
IOBase
tillhandahåller dessa dataattribut och metoder:- close()¶
Spola och stäng denna ström. Denna metod har ingen effekt om filen redan är stängd. När filen är stängd kommer alla operationer på filen (t.ex. läsning eller skrivning) att ge upphov till ett
ValueError
.Som en bekvämlighet är det tillåtet att anropa denna metod mer än en gång; endast det första anropet kommer dock att ha en effekt.
- closed¶
True
om strömmen är stängd.
- fileno()¶
Returnerar den underliggande filbeskrivaren (ett heltal) för strömmen om den finns. Ett
OSError
uppstår om IO-objektet inte använder en fildeskriptor.
- flush()¶
Töm skrivbuffertarna i strömmen om tillämpligt. Detta gör ingenting för skrivskyddade och icke-blockerande strömmar.
- isatty()¶
Returnerar
True
om strömmen är interaktiv (d.v.s. ansluten till en terminal/tty-enhet).
- readable()¶
Returnerar
True
om strömmen kan läsas från. OmFalse
, kommerread()
att ge upphov tillOSError
.
- readline(size=-1, /)¶
Läser och returnerar en rad från strömmen. Om size anges kommer högst size byte att läsas.
Radavslutaren är alltid
b'\n'
för binära filer; för textfiler kan argumentet newline tillopen()
användas för att välja den eller de radavslutare som ska identifieras.
- readlines(hint=-1, /)¶
Läser och returnerar en lista med rader från strömmen. hint kan anges för att styra antalet rader som läses: inga fler rader läses om den totala storleken (i byte/tecken) på alla rader hittills överstiger hint.
hint-värden på
0
eller mindre, liksomNone
, behandlas som ingen hint.Observera att det redan är möjligt att iterera på filobjekt med
for line in file: ...
utan att anropafile.readlines()
.
- seek(offset, whence=os.SEEK_SET, /)¶
Ändra strömpositionen till den angivna byten offset, tolkad relativt den position som anges av whence, och returnera den nya absoluta positionen. Värden för whence är:
os.SEEK_SET
eller0
– början på strömmen (standard); offset ska vara noll eller positivos.SEEK_CUR
eller1
– aktuell strömposition; offset kan vara negativos.SEEK_END
eller2
– slutet på strömmen; offset är vanligtvis negativ
Tillagd i version 3.1: Konstanterna
SEEK_*
.Tillagd i version 3.3: Vissa operativsystem kan stödja ytterligare värden, t.ex.
os.SEEK_HOLE
elleros.SEEK_DATA
. Vilka värden som är giltiga för en fil kan bero på om den öppnas i text- eller binärläge.
- seekable()¶
Returnerar
True
om strömmen stöder slumpmässig åtkomst. OmFalse
, kommerseek()
,tell()
ochtruncate()
att ge upphov tillOSError
.
- tell()¶
Returnerar den aktuella positionen för strömmen.
- truncate(size=None, /)¶
Ändra storlek på strömmen till den angivna storleken i byte (eller den aktuella positionen om storleken inte anges). Den aktuella strömpositionen ändras inte. Denna storleksändring kan utöka eller minska den aktuella filstorleken. Vid utökning beror innehållet i det nya filområdet på plattformen (på de flesta system är ytterligare byte nollfyllda). Den nya filstorleken returneras.
Ändrad i version 3.5: Windows nollfyller nu filer vid utökning.
- writable()¶
Returnerar
True
om strömmen stöder skrivning. OmFalse
, kommerwrite()
ochtruncate()
att ge upphov tillOSError
.
- writelines(lines, /)¶
Skriv en lista med rader till strömmen. Radavgränsare läggs inte till, så det är vanligt att varje rad som tillhandahålls har en radavgränsare i slutet.
- class io.RawIOBase¶
Basklass för råa binära strömmar. Den ärver från
IOBase
.Råa binära strömmar ger vanligtvis åtkomst på låg nivå till en underliggande OS-enhet eller API och försöker inte kapsla in den i primitiver på hög nivå (denna funktionalitet görs på en högre nivå i buffrade binära strömmar och textströmmar, som beskrivs senare på den här sidan).
RawIOBase
tillhandahåller dessa metoder utöver dem frånIOBase
:- read(size=-1, /)¶
Läser upp till size bytes från objektet och returnerar dem. Om size är ospecificerad eller -1 returneras alla byte fram till EOF, som en bekvämlighetsåtgärd. I annat fall görs bara ett enda systemanrop. Färre än size byte kan returneras om operativsystemets anrop returnerar färre än size byte.
Om 0 byte returneras och size inte var 0, indikerar detta slutet på filen. Om objektet är i icke-blockerande läge och inga byte är tillgängliga returneras
None
.Standardimplementeringen hänvisar till
readall()
ochreadinto()
.
- readall()¶
Läs och returnera alla bytes från strömmen till EOF, med flera anrop till strömmen om det behövs.
- readinto(b, /)¶
Läser in byte i ett förallokerat, skrivbart bytesliknande objekt b, och returnerar antalet lästa byte. Till exempel kan b vara en
bytearray
. Om objektet är i icke-blockerande läge och inga bytes är tillgängliga returnerasNone
.
- write(b, /)¶
Skriver det angivna bytes-like object, b, till den underliggande råströmmen och returnerar antalet bytes som skrivits. Detta kan vara mindre än längden på b i byte, beroende på detaljerna i den underliggande råströmmen, och särskilt om den är i icke-blockerande läge.
None
returneras om råströmmen är inställd på att inte blockera och ingen enskild byte lätt kan skrivas till den. Den som anropar kan frigöra eller mutera b efter att denna metod returnerats, så implementationen bör endast komma åt b under metodanropet.
- class io.BufferedIOBase¶
Basklass för binära strömmar som stöder någon form av buffring. Den ärver från
IOBase
.Den största skillnaden med
RawIOBase
är att metodernaread()
,readinto()
ochwrite()
försöker (respektive) läsa så mycket indata som begärs eller att skicka ut all data som tillhandahålls.Dessutom, om den underliggande råströmmen är i icke-blockerande läge, när systemet återgår skulle blockera
write()
kommer att ge upphov tillBlockingIOError
medBlockingIOError.characters_written
ochread()
kommer att returnera data som lästs hittills ellerNone
om inga data finns tillgängliga.Dessutom har metoden
read()
inte någon standardimplementering som hänvisar tillreadinto()
.En typisk
BufferedIOBase
-implementation bör inte ärva från enRawIOBase
-implementation, utan omsluta en sådan, somBufferedWriter
ochBufferedReader
gör.BufferedIOBase
tillhandahåller eller åsidosätter dessa dataattribut och metoder utöver dem frånIOBase
:- raw¶
Den underliggande råströmmen (en
RawIOBase
-instans) somBufferedIOBase
hanterar. Detta är inte en del avBufferedIOBase
API och kanske inte existerar i vissa implementationer.
- detach()¶
Separera den underliggande råströmmen från bufferten och returnera den.
Efter att råströmmen har kopplats bort är bufferten i ett oanvändbart tillstånd.
Vissa buffertar, som
BytesIO
, har inte konceptet med en enda rå ström att returnera från den här metoden. De ger upphov tillUnsupportedOperation
.Tillagd i version 3.1.
- read(size=-1, /)¶
Läser och returnerar upp till size bytes. Om argumentet utelämnas,
None
, eller negativ läs så mycket som möjligt.Färre bytes kan returneras än vad som begärts. Ett tomt
bytes
-objekt returneras om strömmen redan är vid EOF. Mer än en läsning kan göras och anrop kan göras om om specifika fel påträffas, seos.read()
och PEP 475 för mer information. Att mindre än en byte returneras betyder inte att EOF är nära förestående.När man läser så mycket som möjligt kommer standardimplementationen att använda
raw.readall
om det finns tillgängligt (vilket bör implementeraRawIOBase.readall`()
), annars kommer den att läsa i en loop tills read returnerarNone
, en tombytes
, eller ett fel som inte kan retireras. För de flesta flöden är detta till EOF, men för icke-blockerande flöden kan mer data bli tillgänglig.Anteckning
När den underliggande råströmmen är icke-blockerande kan implementationer antingen ge upphov till
BlockingIOError
eller returneraNone
om inga data finns tillgängliga.io
-implementationer returnerarNone
.
- read1(size=-1, /)¶
Läser och returnerar upp till size bytes, anropar
readinto()
som kan försöka igen omEINTR
påträffas enligt PEP 475. Om size är-1
eller inte tillhandahålls, kommer implementationen att välja ett godtyckligt värde för size.Anteckning
När den underliggande råströmmen är icke-blockerande kan implementationer antingen ge upphov till
BlockingIOError
eller returneraNone
om inga data finns tillgängliga.io
-implementationer returnerarNone
.
- readinto(b, /)¶
Läser in bytes i ett förallokerat, skrivbart bytesliknande objekt b och returnerar antalet lästa bytes. Till exempel kan b vara en
bytearray
.Liksom
read()
kan flera läsningar göras av den underliggande råströmmen, såvida inte den senare är interaktiv.Ett
BlockingIOError
uppstår om den underliggande råströmmen är i icke-blockerande läge och inte har några data tillgängliga för tillfället.
- readinto1(b, /)¶
Läser in bytes i ett förallokerat, skrivbart bytesliknande objekt b, med högst ett anrop till den underliggande råströmmens
read()
(ellerreadinto()
) metod. Returnerar antalet lästa byte.Ett
BlockingIOError
uppstår om den underliggande råströmmen är i icke-blockerande läge och inte har några data tillgängliga för tillfället.Tillagd i version 3.5.
- write(b, /)¶
Skriv det angivna bytes-like object, b, och returnera antalet skrivna bytes (alltid lika med längden på b i bytes, eftersom om skrivningen misslyckas kommer ett
OSError
att uppstå). Beroende på den faktiska implementationen kan dessa byte skrivas direkt till den underliggande strömmen eller hållas i en buffert av prestanda- och latensskäl.I icke-blockerande läge uppstår ett
BlockingIOError
om data behöver skrivas till råströmmen men den inte kan ta emot all data utan att blockera.Anroparen kan frigöra eller mutera b efter att denna metod har returnerats, så implementationen bör endast komma åt b under metodanropet.
I/O för rå fil¶
- class io.FileIO(name, mode='r', closefd=True, opener=None)¶
En rå binär ström som representerar en fil på OS-nivå som innehåller bytesdata. Den ärver från
RawIOBase
.Namnet kan vara en av två saker:
en teckensträng eller ett
bytes
-objekt som representerar sökvägen till den fil som ska öppnas. I detta fall måste closefd varaTrue
(standard) annars kommer ett fel att uppstå.ett heltal som representerar numret på en befintlig filbeskrivare på OS-nivå som det resulterande
FileIO
-objektet kommer att ge tillgång till. När FileIO-objektet stängs kommer även denna fd att stängas, såvida inte closefd är satt tillFalse
.
mode kan vara
'r'
,'w'
,'x'
eller'a'
för läsning (standard), skrivning, exklusivt skapande eller appending. Filen kommer att skapas om den inte existerar när den öppnas för att skrivas eller läggas till; den kommer att avkortas när den öppnas för att skrivas.FileExistsError
kommer att uppstå om den redan existerar när den öppnas för att skapas. Att öppna en fil för skapande innebär skrivning, så detta läge beter sig på ett liknande sätt som'w'
. Lägg till ett'+'
till läget för att tillåta samtidig läsning och skrivning.Metoderna
read()
(när de anropas med ett positivt argument),readinto()
ochwrite()
för denna klass kommer endast att göra ett systemanrop.En anpassad öppnare kan användas genom att skicka en callable som opener. Den underliggande filbeskrivaren för filobjektet erhålls sedan genom att anropa opener med (name, flags). opener måste returnera en öppen filbeskrivare (att skicka
os.open
som opener resulterar i funktionalitet som liknar att skickaNone
).Den nyskapade filen är icke-ärftlig.
Se den inbyggda funktionen
open()
för exempel på hur parametern opener kan användas.Ändrad i version 3.3: Parametern opener lades till. Läget
'x'
lades till.Ändrad i version 3.4: Filen är nu inte ärftlig.
FileIO
tillhandahåller dessa dataattribut i tillägg till dem frånRawIOBase
ochIOBase
:- mode¶
Det läge som anges i konstruktören.
- name¶
Filens namn. Detta är filbeskrivningen för filen om inget namn anges i konstruktorn.
Buffrade vattendrag¶
Buffrade I/O-strömmar ger ett gränssnitt på högre nivå till en I/O-enhet än vad rå I/O gör.
- class io.BytesIO(initial_bytes=b'')¶
En binär ström som använder en bytesbuffert i minnet. Den ärver från
BufferedIOBase
. Bufferten kasseras när metodenclose()
anropas.Det valfria argumentet initial_bytes är ett bytesliknande objekt som innehåller initialdata.
BytesIO
tillhandahåller eller åsidosätter dessa metoder utöver dem frånBufferedIOBase
ochIOBase
:- getbuffer()¶
Returnerar en läsbar och skrivbar vy över innehållet i bufferten utan att kopiera det. Om du ändrar vyn kommer du också att uppdatera innehållet i bufferten på ett transparent sätt:
>>> b = io.BytesIO(b"abcdef") >>> view = b.getbuffer() >>> view[2:4] = b"56" >>> b.getvalue() b'ab56ef'
Anteckning
Så länge vyn finns kan objektet
BytesIO
inte ändras i storlek eller stängas.Tillagd i version 3.2.
- read1(size=-1, /)¶
I
BytesIO
är detta samma sak somread()
.Ändrad i version 3.7: Argumentet size är nu valfritt.
- readinto1(b, /)¶
I
BytesIO
är detta samma sak somreadinto()
.Tillagd i version 3.5.
- class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
En buffrad binär ström som ger tillgång på högre nivå till en läsbar, icke sökbar
RawIOBase
rå binär ström. Den ärver frånBufferedIOBase
.När data läses från detta objekt kan en större mängd data begäras från den underliggande råströmmen och förvaras i en intern buffert. Den buffrade datan kan sedan returneras direkt vid efterföljande läsningar.
Konstruktorn skapar en
BufferedReader
för den givna läsbara raw-strömmen och buffer_size. Om buffer_size utelämnas användsDEFAULT_BUFFER_SIZE
.BufferedReader
tillhandahåller eller åsidosätter dessa metoder utöver dem frånBufferedIOBase
ochIOBase
:- peek(size=0, /)¶
Returnerar byte från strömmen utan att flytta fram positionen. Antalet bytes som returneras kan vara färre eller fler än vad som begärts. Om den underliggande råströmmen är icke-blockerande och operationen skulle blockera, returneras tomma bytes.
- read(size=-1, /)¶
I
BufferedReader
är detta samma sak somio.BufferedIOBase.read()
- read1(size=-1, /)¶
I
BufferedReader
är detta samma sak somio.BufferedIOBase.read1()
Ändrad i version 3.7: Argumentet size är nu valfritt.
- class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
En buffrad binär ström som ger tillgång på högre nivå till en skrivbar, icke sökbar
RawIOBase
rå binär ström. Den ärver frånBufferedIOBase
.När man skriver till detta objekt placeras data normalt i en intern buffert. Bufferten kommer att skrivas ut till det underliggande
RawIOBase
-objektet under olika förhållanden, inklusive:när bufferten blir för liten för alla väntande data;
när
flush()
anropas;när en
seek()
begärs (förBufferedRandom
-objekt);när
BufferedWriter
-objektet stängs eller förstörs.
Konstruktorn skapar en
BufferedWriter
för den givna skrivbara raw-strömmen. Om buffer_size inte anges är standardvärdetDEFAULT_BUFFER_SIZE
.BufferedWriter
tillhandahåller eller åsidosätter dessa metoder utöver dem frånBufferedIOBase
ochIOBase
:- flush()¶
Tvingar byte som finns i bufferten in i råströmmen. Ett
BlockingIOError
bör uppstå om den råa strömmen blockeras.
- write(b, /)¶
Skriv det bytes-like object, b, och returnera antalet skrivna byte. I icke-blockerande läge uppstår ett
BlockingIOError
medBlockingIOError.characters_written
inställt om bufferten behöver skrivas ut men råströmmen blockerar.
- class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
En buffrad binär ström som ger tillgång på högre nivå till en sökbar
RawIOBase
rå binär ström. Den ärver frånBufferedReader
ochBufferedWriter
.Konstruktorn skapar en läsare och skrivare för en sökbar råström, som anges i det första argumentet. Om buffer_size utelämnas är standardvärdet
DEFAULT_BUFFER_SIZE
.BufferedRandom
kan göra allt somBufferedReader
ellerBufferedWriter
kan göra. Dessutom ärseek()
ochtell()
garanterat implementerade.
- class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /)¶
En buffrad binär ström som ger tillgång på högre nivå till två icke sökbara
RawIOBase
råa binära strömmar—den ena läsbar, den andra skrivbar. Den ärver frånBufferedIOBase
.reader och writer är
RawIOBase
-objekt som är läsbara respektive skrivbara. Om buffer_size utelämnas är standardvärdetDEFAULT_BUFFER_SIZE
.BufferedRWPair
implementerar allaBufferedIOBase
:s metoder utomdetach()
, som ger upphov tillUnsupportedOperation
.Varning
BufferedRWPair
försöker inte synkronisera åtkomst till sina underliggande råströmmar. Du bör inte skicka samma objekt till den som läsare och skrivare; användBufferedRandom
istället.
Text I/O¶
- class io.TextIOBase¶
Basklass för textströmmar. Denna klass ger ett tecken- och radbaserat gränssnitt för strömmens I/O. Den ärver från
IOBase
.TextIOBase
tillhandahåller eller åsidosätter dessa dataattribut och metoder utöver dem frånIOBase
:- encoding¶
Namnet på den kodning som används för att avkoda strömmens bytes till strängar och för att koda strängar till bytes.
- errors¶
Felinställningen för avkodaren eller kodaren.
- newlines¶
En sträng, en tupel av strängar eller
None
, som anger de nya linjer som hittills översatts. Beroende på implementationen och de initiala konstruktörsflaggorna kanske detta inte är tillgängligt.
- buffer¶
Den underliggande binära bufferten (en
BufferedIOBase
ellerRawIOBase
instans) somTextIOBase
hanterar. Detta är inte en del avTextIOBase
API och kanske inte finns i vissa implementationer.
- detach()¶
Separera den underliggande binära bufferten från
TextIOBase
och returnera den.Efter att den underliggande bufferten har tagits bort är
TextIOBase
i ett oanvändbart tillstånd.Vissa
TextIOBase
implementationer, somStringIO
, kanske inte har konceptet med en underliggande buffert och att anropa denna metod kommer att ge upphov tillUnsupportedOperation
.Tillagd i version 3.1.
- read(size=-1, /)¶
Läser och returnerar högst storlek tecken från strömmen som en enda
str
. Om storlek är negativ ellerNone
, läses till EOF.
- readline(size=-1, /)¶
Läser till newline eller EOF och returnerar en enda
str
. Om strömmen redan är vid EOF returneras en tom sträng.Om size anges kommer högst size tecken att läsas.
- seek(offset, whence=SEEK_SET, /)¶
Ändra strömpositionen till den angivna offset. Beteendet beror på parametern whence. Standardvärdet för whence är
SEEK_SET
.SEEK_SET
eller0
: söker från början av strömmen (standard); offset måste antingen vara ett tal som returneras avTextIOBase.tell()
, eller noll. Alla andra offset-värden ger ett odefinierat beteende.SEEK_CUR
eller1
: ”Sök” till den aktuella positionen; offset måste vara noll, vilket är en no-operation (alla andra värden stöds inte).SEEK_END
eller2
: sök till slutet av strömmen; offset måste vara noll (alla andra värden stöds inte).
Returnerar den nya absoluta positionen som ett opakt tal.
Tillagd i version 3.1: Konstanterna
SEEK_*
.
- tell()¶
Returnerar den aktuella strömpositionen som ett ogenomskinligt tal. Numret representerar vanligtvis inte ett antal byte i den underliggande binära lagringen.
- write(s, /)¶
Skriv strängen s till strömmen och returnera antalet tecken som skrivits.
- class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)¶
En buffrad textström som ger tillgång på högre nivå till en buffrad binär ström av typen
BufferedIOBase
. Den ärver frånTextIOBase
.encoding anger namnet på den kodning som strömmen ska avkodas eller kodas med. I UTF-8 Mode är standardvärdet UTF-8. Annars är standardvärdet
locale.getencoding()
.encoding="locale"
kan användas för att ange den aktuella lokalens kodning explicit. Se Teckenuppsättning för mer information.errors är en valfri sträng som anger hur kodnings- och avkodningsfel ska hanteras. Ange
'strict'
för att skapa ettValueError
undantag om det finns ett kodningsfel (standardvärdetNone
har samma effekt), eller ange'ignore'
för att ignorera fel. (Observera att ignorering av kodningsfel kan leda till dataförlust.)'replace'
gör att en ersättningsmarkör (t.ex.'?'
) infogas där det finns felaktiga data.'backslashreplace'
gör att felaktiga data ersätts med en bakåtstreckad escape-sekvens. Vid skrivning kan'xmlcharrefreplace'
(ersätter med lämplig XML-teckenreferens) eller'namereplace'
(ersätter medN{...}
escape-sekvenser) användas. Alla andra felhanteringsnamn som har registrerats medcodecs.register_error()
är också giltiga.newline styr hur radavslut ska hanteras. Den kan vara
None
,''
,'\n'
,'\r'
och'\r\n'
. Det fungerar på följande sätt:Om newline är
None
aktiveras universal newlines-läget när indata läses från strömmen. Rader i inmatningen kan sluta på'\n'
,'\r'
eller'\r\n'
, och dessa översätts till'\n'
innan de returneras till den som anropar. Om newline är''
aktiveras universal newlines mode, men radavslut returneras till uppringaren oöversatta. Om newline har något av de andra lagliga värdena avslutas inmatningsraderna endast med den angivna strängen, och radavslutningen returneras till den som ringer upp utan att översättas.Om newline är
None
när utdata skrivs till strömmen, översätts alla'\n'
-tecken som skrivs till systemets standardradavgränsare,os.linesep
. Om newline är''
eller'\n'
sker ingen översättning. Om newline är något av de andra lagliga värdena översätts alla'\n'
-tecken som skrivs till den angivna strängen.
Om line_buffering är
True
, ärflush()
implicit när ett anrop till write innehåller ett tecken för ny rad eller en vagnsretur.Om write_through är
True
garanteras att anrop tillwrite()
inte buffras: all data som skrivs påTextIOWrapper
-objektet hanteras omedelbart till dess underliggande binära buffer.Ändrad i version 3.3: Argumentet write_through har lagts till.
Ändrad i version 3.3: Standard kodning är nu
locale.getpreferredencoding(False)
istället förlocale.getpreferredencoding()
. Ändra inte tillfälligt den lokala kodningen medlocale.setlocale()
, använd den aktuella lokala kodningen istället för den kodning som användaren föredrar.Ändrad i version 3.10: Argumentet encoding stöder nu det fiktiva kodningsnamnet
"locale"
.Anteckning
När den underliggande råströmmen är icke-blockerande kan ett
BlockingIOError
uppstå om en läsoperation inte kan slutföras omedelbart.TextIOWrapper
tillhandahåller dessa dataattribut och metoder utöver dem frånTextIOBase
ochIOBase
:- line_buffering¶
Om linjebuffring är aktiverad.
- write_through¶
Om skrivningar skickas omedelbart till den underliggande binära bufferten.
Tillagd i version 3.7.
- reconfigure(*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None)¶
Omkonfigurera denna textström med nya inställningar för kodning, fel, ny rad, linje_buffring och skrivgenomgång.
Parametrar som inte anges behåller aktuella inställningar, förutom
errors='strict'
som används när encoding anges men errors inte anges.Det är inte möjligt att ändra kodning eller newline om data redan har lästs från flödet. Å andra sidan är det möjligt att ändra kodning efter skrivning.
Denna metod gör en implicit strömspolning innan de nya parametrarna ställs in.
Tillagd i version 3.7.
Ändrad i version 3.11: Metoden stöder alternativet
encoding="locale"
.
- seek(cookie, whence=os.SEEK_SET, /)¶
Ställ in strömpositionen. Returnera den nya strömpositionen som en
int
.Det finns stöd för fyra operationer, som beskrivs med följande argumentkombinationer:
seek(0, SEEK_SET)
: Spola tillbaka till början av strömmen.seek(cookie, SEEK_SET)
: Återställer en tidigare position; cookie måste vara ett nummer som returnerats avtell()
.seek(0, SEEK_END)
: Snabbspola till slutet av strömmen.seek(0, SEEK_CUR)
: Lämna den aktuella stream-positionen oförändrad.
Alla andra argumentkombinationer är ogiltiga och kan leda till undantag.
Se även
os.SEEK_SET
,os.SEEK_CUR
, ochos.SEEK_END
.
- class io.StringIO(initial_value='', newline='\n')¶
En textström som använder en textbuffert i minnet. Den ärver från
TextIOBase
.Textbufferten kasseras när metoden
close()
anropas.Det initiala värdet för bufferten kan ställas in genom att ange initial_value. Om översättning av nya rader är aktiverad kommer nya rader att kodas som om de vore
write()
. Strömmen placeras i början av bufferten, vilket emulerar öppnandet av en befintlig fil i ettw+
-läge, vilket gör den redo för en omedelbar skrivning från början eller för en skrivning som skulle skriva över det initiala värdet. För att emulera öppnandet av en fil i etta+
-läge som är redo att läggas till, användf.seek(0, io.SEEK_END)
för att flytta strömmen till slutet av bufferten.Argumentet newline fungerar som i
TextIOWrapper
, förutom att när utdata skrivs till strömmen, om newline ärNone
, skrivs nya linjer som\n
på alla plattformar.StringIO
tillhandahåller denna metod utöver de som finns iTextIOBase
ochIOBase
:- getvalue()¶
Returnerar en
str
som innehåller hela innehållet i bufferten. Nya rader avkodas som om de voreread()
, även om flödespositionen inte ändras.
Exempel på användning:
import io output = io.StringIO() output.write('Första raden.\n') print('Andra raden.', file=output) # Hämta filinnehållet -- detta kommer att vara # 'Första raden.\nSekundära raden.\n' innehåll = output.getvalue() # Stäng objektet och kasta minnesbufferten -- # .getvalue() kommer nu att ge upphov till ett undantag. output.close()
- class io.IncrementalNewlineDecoder¶
En hjälpcodec som avkodar newlines för universal newlines-läget. Den ärver från
codecs.IncrementalDecoder
.
Statisk typning¶
Följande protokoll kan användas för att annotera funktions- och metodargument för enkla läs- eller skrivoperationer i strömmar. De är dekorerade med @typing.runtime_checkable
.
- class io.Reader[T]¶
Generiskt protokoll för att läsa från en fil eller annan inmatningsström.
T
kommer vanligtvis att varastr
ellerbytes
, men kan vara vilken typ som helst som läses från strömmen.Tillagd i version 3.14.
- read()¶
- read(size, /)
Läser data från inmatningsströmmen och returnerar den. Om size anges ska det vara ett heltal, och högst size objekt (byte/tecken) kommer att läsas.
Till exempel:
def read_it(reader: Läsare[str]): data = läsare.läs(11) assert isinstance(data, str)
- class io.Writer[T]¶
Generiskt protokoll för att skriva till en fil eller annan utdataström.
T
kommer vanligtvis att varastr
ellerbytes
, men kan vara vilken typ som helst som kan skrivas till strömmen.Tillagd i version 3.14.
- write(data, /)¶
Skriv data till utdataströmmen och returnera antalet objekt (bytes/tecken) som skrivits.
Till exempel:
def write_binary(writer: Writer[bytes]): writer.write(b"Hej världen!\n")
Se ABC och protokoll för att arbeta med I/O för andra I/O-relaterade protokoll och klasser som kan användas för statisk typkontroll.
Prestanda¶
I det här avsnittet diskuteras prestandan för de konkreta I/O-implementeringarna.
Binär I/O¶
Genom att bara läsa och skriva stora bitar data även när användaren ber om en enda byte döljer buffrad I/O ineffektiviteten i anrop och exekvering av operativsystemets obuffrade I/O-rutiner. Vinsten beror på operativsystemet och vilken typ av I/O som utförs. På vissa moderna operativsystem som Linux kan till exempel obuffrad disk-I/O vara lika snabb som buffrad I/O. Slutsatsen är dock att buffrad I/O ger förutsägbar prestanda oavsett plattform och backingenhet. Därför är det nästan alltid att föredra att använda buffrad I/O i stället för obuffrad I/O för binära data.
Text I/O¶
Text-I/O över en binär lagring (t.ex. en fil) är betydligt långsammare än binär I/O över samma lagring, eftersom det krävs konverteringar mellan unicode och binär data med hjälp av en teckenkodek. Detta kan bli märkbart vid hantering av stora mängder textdata, t.ex. stora loggfiler. Dessutom är både tell()
och seek()
ganska långsamma på grund av den rekonstruktionsalgoritm som används.
StringIO
är dock en inbyggd unicode-behållare i minnet och kommer att uppvisa liknande hastighet som BytesIO
.
Multi-threading¶
FileIO
-objekt är trådsäkra i den utsträckning som de anrop från operativsystemet (t.ex. read(2) under Unix) som de omsluter också är trådsäkra.
Binära buffrade objekt (instanser av BufferedReader
, BufferedWriter
, BufferedRandom
och BufferedRWPair
) skyddar sina interna strukturer med hjälp av ett lås; det är därför säkert att anropa dem från flera trådar samtidigt.
TextIOWrapper
-objekt är inte tråd-säkra.
Reentrancy¶
Binära buffrade objekt (instanser av BufferedReader
, BufferedWriter
, BufferedRandom
och BufferedRWPair
) är inte reentranta. Även om reentranta anrop inte kommer att ske i normala situationer kan de uppstå när I/O görs i en signal
-hanterare. Om en tråd försöker återgå till ett buffrat objekt som den redan har tillgång till, uppstår ett RuntimeError
. Observera att detta inte hindrar en annan tråd från att komma in i det buffrade objektet.
Ovanstående gäller implicit även textfiler, eftersom funktionen open()
kommer att packa in ett buffrat objekt i en TextIOWrapper
. Detta inkluderar standardströmmar och påverkar därför även den inbyggda funktionen print()
.