Verschil tussen modi a, a+, w, w+ en r+ in ingebouwde open functie?

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 fopenmanpagedefinieert 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: aen 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 writewordt genegeerd
write('aa'); seek(0, 0); read(2); write('b')– seconde writeverhoogt IOError


Antwoord 4, autoriteit 5%

De opties zijn hetzelfde als voor de fopen-functiein de C-standaardbibliotheek :

wkapt het bestand af en overschrijft wat er al was

awordt 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, aworden gecombineerd met de modusmodifiers bof t. +is optioneel toegevoegd, Umoet worden vermeden.

Zoals ik op de harde manier ontdekte, is het een goed idee om altijd top te geven bij het openen van een bestand in tekstmodus, aangezien reen alias is voor rtin de standaard open()-functie maar een alias voor rbin de open()-functies van alle compressiemodules (wanneer bijv. het lezen van een *.bz2bestand).

Dus de modi voor het openen van een bestand moeten zijn:

rt/ wt/ xt/ atvoor het lezen / schrijven / maken / toevoegen aan een bestand in tekstmodus en

rb/ wb/ xb/ abvoor 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

Other episodes