python ouverte construite en fonction: différence entre les modes a, a+, w -, w+ et r+?

dans la fonction Python intégrée open , Quelle est la différence exacte entre les modes w , a , w+ , a+ , et r+ ?

en particulier, la documentation implique que tout cela permettra d'écrire dans le fichier, et dit qu'elle ouvre les fichiers pour" ajouter"," écrire", et" mettre à jour " spécifiquement, mais ne définit pas ce que ces termes signifient.

426
demandé sur Simon 2009-09-23 17:27:36

6 réponses

les modes d'ouverture sont exactement les mêmes que ceux de la fonction bibliothèque standard C fopen() .

le BSD fopen manpage Les définit comme suit:

 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.
522
répondu drAlberT 2018-03-03 15:55:03

j'ai remarqué que de temps en temps je dois Google fopen à nouveau, juste pour construire une image mentale de ce que les différences primaires entre les modes sont. Donc, je pensais qu'un diagramme serait plus rapide à lire la prochaine fois. Peut-être que quelqu'un d'autre trouvera ça utile aussi.

320
répondu Andrzej Pronobis 2015-06-01 05:13:40

même info, juste sous forme de tableau

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

où les significations sont: (juste pour éviter toute interprétation erronée)

  • la lecture à partir du fichier est autorisée
  • écrire - écrire au fichier est autorisé

  • Créer - fichier est créé s'il n'existe pas encore

  • trunctate - lors de l'ouverture de la fichier il est fait vide (tout le contenu du fichier est effacé)

  • position au début - après que le fichier est ouvert, position initiale est définie au début du fichier

  • position à la fin - après que le fichier est ouvert, position initiale est réglée à la fin du fichier

Note: a et a+ toujours ajouter à la fin du fichier - ignore tout seek des mouvements.

BTW. comportement intéressant au moins sur mon win7 / python2.7, pour un nouveau fichier ouvert en mode a+ :

write('aa'); seek(0, 0); read(1); write('b') - deuxième write est ignoré

write('aa'); seek(0, 0); read(2); write('b') - deuxième write soulève IOError

129
répondu industryworker3595112 2017-12-28 07:22:02

les options sont les mêmes que pour la fonction fopen dans la bibliothèque C standard:

w tronque le fichier, écrasant tout ce qui y était déjà

a ajoute au fichier ce qui y était déjà

w+ ouvre pour lire et écrire, tronquant le fichier, mais vous permettant également de relire ce qui a été écrit dans le fichier

a+ s'ouvre en annexe et en lecture, vous permettant à la fois d'ajouter au fichier et de lire son contenu.""

36
répondu Eli Courtwright 2009-09-23 13:33:37

j'ai frappé sur ce en essayant de comprendre pourquoi vous utiliseriez le mode 'w+' versus 'w'. À la fin, j'ai juste fait quelques tests. Je ne vois pas beaucoup d'utilité pour le mode 'w+', car dans les deux cas, le fichier est tronqué pour commencer. Cependant, avec le " w+", vous pouvez lire après avoir écrit, en cherchant en arrière. Si vous essayiez de lire avec "w", ça lancerait un IOError. Lire sans utiliser seek avec le mode 'w+' ne donnera rien, puisque le pointeur de fichier sera après où vous avez écrit.

7
répondu Wyrmwood 2015-06-21 21:05:27

je pense que c'est important à considérer pour l'exécution multiplateforme, c.-à-d. en tant que CYA. :)

sur Windows, 'b' ajouté au mode ouvre le fichier en mode binaire, il y a donc aussi des modes comme 'rb', 'wb', et 'r+b'. Python sur Windows fait une distinction entre les fichiers texte et binaires; les caractères de fin de ligne dans les fichiers texte sont automatiquement modifiés légèrement lorsque les données sont lues ou écrites. Cette modification en coulisse des données de fichier est très bien pour Des fichiers texte ASCII, mais ça corrompt les données binaires comme ça dans les fichiers JPEG ou EXE. Soyez très prudent d'utiliser le mode binaire lors de la lecture et de l'écriture de tels fichiers. Sur Unix, cela ne fait pas de mal d'ajouter un " b " au mode, donc vous pouvez utiliser la plate-forme informatique-indépendamment pour tous les fichiers binaires.

C'est directement tirée de la Python Software Foundation 2.7.x .

6
répondu Goran B. 2017-01-05 01:51:52