Wat is het exacte verschil in de in python ingebouwde open-functie tussen de modi w
, a
, w+
, a+
en r+
?
In het bijzonder impliceert de documentatie dat al deze het schrijven naar het bestand toelaten, en zegt dat het de bestanden specifiek opent voor “toevoegen”, “schrijven” en “bijwerken”, maar definieert niet wat deze termen betekenen .
Antwoord 1, autoriteit 100%
De openingsmodi zijn exact dezelfde als die voor de C-standaardbibliotheekfunctie fopen()
.
De BSD fopen
manpagedefinieert ze als volgt :
The argument mode points to a string beginning with one of the following
sequences (Additional characters may follow these sequences.):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning of the file.
``w'' Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
``w+'' Open for reading and writing. The file is created if it does not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to the file will always end up at the then current end of file,
irrespective of any intervening fseek(3) or similar.
``a+'' Open for reading and writing. The file is created if it does not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
Antwoord 2, autoriteit 74%
Het viel me op dat ik af en toe opnieuw moet gaan Googlen, alleen om een mentaal beeld op te bouwen van wat de belangrijkste verschillen tussen de modi zijn. Dus ik dacht dat een diagram de volgende keer sneller te lezen is. Misschien vindt iemand anders dat ook nuttig.
Antwoord 3, autoriteit 29%
Dezelfde info, alleen in tabelvorm
| r r+ w w+ a a+
------------------ | --------------------------
read | + + + +
write | + + + + +
write after seek | + + +
create | + + + +
truncate | + +
position at start | + + + +
position at end | + +
waar de betekenissen zijn:
(om elke verkeerde interpretatie te voorkomen)
- lezen – lezen uit bestand is toegestaan
-
schrijven – schrijven naar bestand is toegestaan
-
create – bestand wordt aangemaakt als het nog niet bestaat
-
afkappen – tijdens het openen van het bestand wordt het leeg gemaakt (alle inhoud van het bestand wordt gewist)
-
positie aan het begin – nadat het bestand is geopend, wordt de beginpositie ingesteld op het begin van het bestand
- positie aan het einde – nadat het bestand is geopend, wordt de beginpositie ingesteld op het einde van het bestand
Opmerking: a
en a+
worden altijd aan het einde van het bestand toegevoegd – negeert alle seek
-bewegingen.
tussen haakjes. interessant gedrag tenminste op mijn win7 / python2.7, voor nieuw bestand geopend in a+
modus:
write('aa'); seek(0, 0); read(1); write('b')
– seconde write
wordt genegeerd
write('aa'); seek(0, 0); read(2); write('b')
– seconde write
verhoogt IOError
Antwoord 4, autoriteit 5%
De opties zijn hetzelfde als voor de fopen-functiein de C-standaardbibliotheek :
w
kapt het bestand af en overschrijft wat er al was
a
wordt toegevoegd aan het bestand en voegt toe aan wat er al was
w+
wordt geopend voor lezen en schrijven, waarbij het bestand wordt afgekapt, maar u ook kunt teruglezen wat er naar het bestand is geschreven
a+
wordt geopend om toe te voegen en te lezen, zodat u zowel aan het bestand kunt toevoegen als de inhoud ervan kunt lezen
Antwoord 5
Ik denk dat dit belangrijk is om te overwegen voor platformonafhankelijke uitvoering, d.w.z. als een CYA. 🙂
In Windows opent ‘b’ toegevoegd aan de modus het bestand in binaire modus, dus er zijn ook modi zoals ‘rb’, ‘wb’ en ‘r+b’. Python op Windows maakt een onderscheid tussen tekst- en binaire bestanden; de einde-regeltekens in tekstbestanden worden automatisch iets gewijzigd wanneer gegevens worden gelezen of geschreven. Deze wijziging achter de schermen van bestandsgegevens is prima voor ASCII-tekstbestanden, maar het corrumpeert binaire gegevens zoals die in JPEG- of EXE-bestanden. Wees zeer voorzichtig om de binaire modus te gebruiken bij het lezen en schrijven van dergelijke bestanden. Op Unix kan het geen kwaad om een ‘b’ aan de modus toe te voegen, zodat je deze platformonafhankelijk kunt gebruiken voor alle binaire bestanden.
Dit wordt rechtstreeks geciteerd uit Python Software Foundation 2.7. x.
Antwoord 6
Ik kwam dit tegen toen ik probeerde uit te zoeken waarom je de modus ‘w+’ versus ‘w’ zou gebruiken. Uiteindelijk heb ik gewoon wat getest. Ik zie niet veel doel voor modus ‘w+’, omdat in beide gevallen het bestand wordt afgekapt om mee te beginnen. Met de ‘w+’ kon je na het schrijven echter lezen door terug te zoeken. Als u een lezing met ‘w’ zou proberen, zou dit een IOError opleveren. Lezen zonder zoeken met modus ‘w+’ zal niets opleveren, omdat de bestandsaanwijzer zich bevindt achter waar je hebt geschreven.
Antwoord 7
Ik vind het belangrijk op te merken dat python 3 de openingsmodi anders definieert dan de antwoorden hier die correct waren voor Python 2.
De Python 3 openingsmodizijn:
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
----
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newlines mode (for backwards compatibility; should not be used in new code)
De modi r
, w
, x
, a
worden gecombineerd met de modusmodifiers b
of t
. +
is optioneel toegevoegd, U
moet worden vermeden.
Zoals ik op de harde manier ontdekte, is het een goed idee om altijd t
op te geven bij het openen van een bestand in tekstmodus, aangezien r
een alias is voor rt
in de standaard open()
-functie maar een alias voor rb
in de open()
-functies van alle compressiemodules (wanneer bijv. het lezen van een *.bz2
bestand).
Dus de modi voor het openen van een bestand moeten zijn:
rt
/ wt
/ xt
/ at
voor het lezen / schrijven / maken / toevoegen aan een bestand in tekstmodus en
rb
/ wb
/ xb
/ ab
voor het lezen / schrijven / maken / toevoegen aan een bestand in binaire modus.
Gebruik +
zoals voorheen.
Antwoord 8
r | r+ | x | x+ | met | w+ | een | een+ | |
---|---|---|---|---|---|---|---|---|
leesbaar | x | x | x | x | x | |||
beschrijfbaar | x | x | x | x | x | x | x | |
standaardpositie: start | x | x | x | x | x | x | ||
standaardpositie: einde | x | x | ||||||
moet bestaan | x | x | ||||||
mag niet bestaan | x | x | ||||||
afkappen (bestand wissen) bij laden | x | x | ||||||
Schrijf altijd naar EOF | x | x |