Différence entre les modes a, a +, w, w + et r + dans la fonction ouverte intégrée?

610

Dans le python intégré ouvert fonction, 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 la signification de ces termes.

fil volant
la source
11
Le lien que vous avez fourni définit exactement les valeurs. Quelle partie du lien que vous avez fourni ne pourriez-vous pas voir ou comprendre? Pourriez-vous clarifier votre question pour expliquer ce que vous n'avez pas compris sur le lien?
S.Lott
@ChrisB. - J'ai signalé cela comme un bug sur bugs.python.org/issue19627
Bulwersator
2
n'y a-t-il pas de document simple et unique expliquant ce que signifie le signe +?
Charlie Parker

Réponses:

740

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

La fopenpage de manuel BSD 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.
drAlberT
la source
3
Je pense que vous voulez dire l'appel fopen dans la bibliothèque standard C (qui n'est pas un appel système)
Eli Courtwright
15
REMARQUE: Python v3 ajoute un certain nombre de modes supplémentaires. lien vers les documents
Alex
5
A noté que wet les w+deux peuvent faireThe file is created if it does not exist
Wei Yang
4
Sous Windows, en bannexe au mode ouvre le fichier en mode binaire, donc il y a aussi des modes tels que rb, wbet 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 légèrement modifiés lorsque les données sont lues ou écrites.
6
ai-je raison de dire que le +ne fait pas quelque chose de cohérent indépendant s'il l'est a, wou r? Ou est-ce que je ne vois pas le motif? Quel est le motif?
Charlie Parker
510

J'ai remarqué que de temps en temps, je dois à nouveau ouvrir Google, juste pour construire une image mentale des principales différences entre les modes. J'ai donc pensé qu'un diagramme sera plus rapide à lire la prochaine fois. Peut-être que quelqu'un d'autre trouvera cela utile aussi.

Andrzej Pronobis
la source
3
La adescription est fausse . Les écritures sont toujours positionnées à la fin.
Antti Haapala
10
@Et je crois que @Antti fait référence à la propriété Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similarqui est un peu plus forte que de simplement dire que la position initiale est la fin.
jcai
8
@CharlieParker Qu'il y a fondamentalement deux opérations sur les fichiers (lecture, écriture). Le mode r est principalement destiné à la lecture, les modes w , a sont principalement destinés à l'écriture. Et le signe plus permet la deuxième opération pour un mode donné (simplement dit).
Jeyekomon
22
Pour la postérité: tronquer signifie écraser depuis le début.
Minh Tran
4
@Jeyekomon Votre résumé dans votre commentaire ici est probablement LA chose la plus utile que j'ai lue en essayant de me familiariser avec ces modes d'une manière dont je me souvienne maintenant! L'organigramme de cette réponse est magnifique et le tableau de la réponse ci-dessous est excellent, mais si ces réponses (et d'autres ailleurs) commençaient par ce point simple et fonctionnaient à partir de là, cela aiderait à fournir un cadre mental bien meilleur pour accrocher les détails sur. Donc merci. (Je sais que c'est peut-être à la limite du spam, mais j'ai senti que votre commentaire méritait d'être reconnu)
Tim
206

Même information, 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 mauvaise interprétation)

  • lecture - la lecture du fichier est autorisée
  • écriture - l'écriture dans un fichier est autorisée

  • create - le fichier est créé s'il n'existe pas encore

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

  • position au début - après l'ouverture du fichier, la position initiale est définie au début du fichier

  • position à la fin - après l'ouverture du fichier, la position initiale est définie à la fin du fichier

Remarque: aet a+toujours ajouter à la fin du fichier - ignore tous les seekmouvements.
BTW. comportement intéressant au moins sur mon win7 / python2.7, pour un nouveau fichier ouvert en a+mode:
write('aa'); seek(0, 0); read(1); write('b')- le second writeest ignoré
write('aa'); seek(0, 0); read(2); write('b')- le second writesoulèveIOError

travailleur de l'industrie3595112
la source
10
Pourquoi n'y a-t-il pas "Créer un fichier s'il n'existe pas. S'il existe, positionner au début, activer la lecture et l'écriture"? C'est le cas d'utilisation le plus évident pour moi: je stocke des données dans un fichier. Si le fichier n'est pas là, créez-le au lieu d'erreurs. S'il y a des données dans le fichier, je veux tout lire par le haut, mettez à jour certaines choses puis réécrivez complètement le fichier à partir de 0 pour la PROCHAINE FOIS que je le charge. J'utilise open(file,'a'); close(); open(file,'r+')pour accomplir cela.
pinhead
2
Que signifie "tronquer" dans ce contexte?
Charlie Parker
3
@CharlieParker Cela signifie que tout le contenu du fichier est effacé (le fichier est vide)
industryworker3595112
1
Vous souhaiterez peut-être ajouter une note selon laquelle aet les a+écritures se produiront toujours à la fin du fichier, que l'on déplace manuellement le pointeur à l'aide de seek().
balu
1
Qu'en est-il de la mise à jour de la table, pour inclure «x» pour Python 3?
Nikos Alexandris
39

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

w tronque le fichier, écrase tout ce qui était déjà là

a ajoute au fichier, ajoutant à tout ce qui était déjà là

w+ s'ouvre pour la lecture et l'écriture, tronquant le fichier mais vous permettant également de relire ce qui a été écrit dans le fichier

a+ s'ouvre pour l'ajout et la lecture, vous permettant à la fois d'ajouter au fichier et de lire son contenu

Eli Courtwright
la source
2
Que signifie "tronquer" dans ce contexte? Cela signifie-t-il de supprimer les anciennes données si elles en avaient? Ou autre chose de plus spécifique?
Charlie Parker
3
@CharlieParker: Correct - cela signifie que toutes les données du fichier existant seront supprimées et nous commençons à écrire depuis le début d'un fichier désormais vide.
Eli Courtwright
9

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

Sous Windows, «b» ajouté au mode ouvre le fichier en mode binaire, il existe donc également 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 des fichiers texte sont automatiquement légèrement modifiés lors de la lecture ou de l'écriture des données. Cette modification en arrière-plan des données de fichier convient aux fichiers texte ASCII, mais elle corrompra les données binaires comme celles des fichiers JPEG ou EXE. Faites très attention à utiliser le mode binaire lors de la lecture et de l'écriture de tels fichiers. Sous Unix, cela ne fait pas de mal d'ajouter un «b» au mode, vous pouvez donc l'utiliser indépendamment de la plate-forme pour tous les fichiers binaires.

Ceci est directement cité de Python Software Foundation 2.7.x .

Goran B.
la source
9

Je l'ai découvert en essayant de comprendre pourquoi vous utiliseriez le mode «w +» par rapport à «w». Au final, je viens de faire quelques tests. Je ne vois pas beaucoup d'intérêt pour le mode 'w +', car dans les deux cas, le fichier est tronqué pour commencer. Cependant, avec le «w +», vous pouviez lire après avoir écrit en cherchant en retour. Si vous tentiez une lecture avec «w», cela déclencherait une erreur IOError. La lecture sans utiliser la recherche avec le mode 'w +' ne produira rien, car le pointeur de fichier sera là où vous avez écrit.

Bois de wyrm
la source