Du doc ,
Les modes 'r +', 'w +' et 'a +' ouvrent le fichier pour la mise à jour (notez que 'w +' tronque le fichier). Ajoutez «b» au mode pour ouvrir le fichier en mode binaire, sur les systèmes qui différencient les fichiers binaires et les fichiers texte; sur les systèmes qui n'ont pas cette distinction, l'ajout du «b» n'a aucun effet.
et ici
w +: ouvre un fichier pour l'écriture et la lecture. Remplace le fichier existant s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour la lecture et l'écriture.
Mais, comment lire un fichier ouvert avec w+
?
Réponses:
Supposons que vous ouvrez le fichier avec une
with
déclaration comme vous devriez l'être. Ensuite, vous feriez quelque chose comme ceci pour lire à partir de votre fichier:Notez le
f.seek(0)
- si vous oubliez cela, l'f.read()
appel tentera de lire depuis la fin du fichier et renverra une chaîne vide.la source
w+
cela "écrasera le fichier existant s'il existe". Ainsi dès que vous ouvrez un fichier avecw+
, il s'agit désormais d'un fichier vide: il contient 0 octet. S'il contenait des données, ces données ont été tronquées - coupées et jetées - et maintenant la taille du fichier est de 0 octet, vous ne pouvez donc pas lire les données qui existaient avant d'ouvrir le fichier avecw+
. Si vous vouliez réellement lire les données précédentes et les ajouter, vous devriez utiliser à lar+
place dew+
.Voici une liste des différents modes d'ouverture d'un fichier:
r
rb
r +
rb +
w
wb
w +
wb +
une
un B
a +
ab +
la source
w+
crée un nouveau fichier ou tronque un fichier existant, puis l'ouvre pour la lecture et l'écriture;r+
ouvre un fichier existant sans le tronquer pour lecture et écriture. Très différent.r
,,w
oua
sont exclusifs, maisb
peuvent être ajoutés à n'importe lequel d'entre eux, comme peut+
, ouU
... C'est une explosion combinatoire.rb
n'est pas le mode par défaut, citation:The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r'
docs.python.org/2/library/functions.html#openTous les modes de fichiers en Python
r
à lirer+
s'ouvre pour la lecture et l'écriture (ne peut pas tronquer un fichier)w
pour écrirew+
pour l'écriture et la lecture (peut tronquer un fichier)rb
pour lire un fichier binaire. Le pointeur de fichier est placé au début du fichier.rb+
lire ou écrire un fichier binairewb+
écrire un fichier binairea+
ouvre pour l'ajoutab+
Ouvre un fichier à ajouter et à lire en binaire. Le pointeur de fichier se trouve à la fin du fichier s'il existe. Le fichier s'ouvre en mode ajout.x
ouvert pour la création exclusive, échoue si le fichier existe déjà (Python 3)la source
rb
etwb
, sans parler desU
modes en 2.x et dut
mode en 3.x (qui peuvent tous les deux être combinés avec tout saufb
).wb+
lit-elle aussi du fichier?r
pour lirew
pour écrirer+
pour lire / écrire sans supprimer le contenu d'origine si le fichier existe, sinon lever l'exceptionw+
pour supprimer le contenu d'origine puis lire / écrire si le fichier existe, sinon créer le fichierPar exemple,
la source
Le fichier est tronqué, vous pouvez donc appeler
read()
(aucune exception levée, contrairement à l'ouverture en utilisant 'w') mais vous obtiendrez une chaîne vide.la source
Je soupçonne qu'il y a deux façons de gérer ce que je pense que vous essayez d'accomplir.
1) ce qui est évident, c'est d'ouvrir le fichier en lecture seule, de le lire en mémoire puis d'ouvrir le fichier avec t, puis d'écrire vos modifications.
2) utilisez les routines de gestion de fichiers de bas niveau:
J'espère que cela t'aides..
la source
r+
En fait, il y a quelque chose qui ne va pas dans toutes les autres réponses sur le
r+
mode.test.in
contenu du fichier:Et le script py:
Exécutez-le et le
test.in
contenu de sera changé en:Cependant, lorsque nous modifions le script pour:
le
test.in
font aussi répondre:Ainsi, le
r+
mode nous permettra de couvrir le contenu depuis le début si nous n'avons pas fait l'opération de lecture. Et si nous faisons une opération de lecture,f.write()
nous ajouterons simplement le fichier.Soit dit en passant, si nous l'avons
f.seek(0,0)
déjà faitf.write(write_content)
, le contenu en écriture les couvrira de la position (0,0).la source
Comme mentionné par h4z3 , pour une utilisation pratique, parfois vos données sont trop volumineuses pour tout charger directement, ou vous avez un générateur, ou des données entrantes en temps réel, vous pouvez utiliser w + pour stocker dans un fichier et lire plus tard.
la source