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.
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.
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.
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
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.""
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.
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 .