Confondu par fichier python en mode “w+”
De la doc,
Modes 'r+', 'w+' et '+' ouvrir le fichier de mise à jour (à noter que 'w+' tronque le fichier). Append 'b' à la mode pour ouvrir le fichier en mode binaire, sur les systèmes qui permettent de la différencier entre le binaire et les fichiers de texte; sur les systèmes qui n'ont pas cette distinction, l'ajout d'un " b " n'a aucun effet.
et ici
w+ : Ouvre un fichier pour l'écriture et la lecture. Remplace le fichier existant si le fichier 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+
?
- J'ai trouvé ceci schéma tout à fait utile.
Vous devez vous connecter pour publier un commentaire.
Disons que vous êtes en ouvrant le fichier avec une
with
déclaration, comme vous devriez l'être. Ensuite, vous feriez quelque chose comme ça à lire à partir de votre fichier:Note le
f.seek(0)
-- si vous l'oubliez, lef.read()
appel d'essayer de lire à partir de la fin du fichier, et renvoie une chaîne vide.w+
va "remplacer le fichier existant si le fichier existe". Donc dès que vous ouvrez un fichier avecw+
, il est maintenant un fichier vide: il contient de 0 octets. Si elle est utilisée pour contenir des données, que les données ont été tronquées — coupés et jetés et que, maintenant, la taille du fichier est de 0 octets, de sorte que vous ne pouvez pas lire les données qui existaient avant vous avez ouvert le fichier avecw+
. Si vous avez réellement envie de lire les données précédentes et les ajouter à cela, vous devez utiliserr+
au lieu dew+
.Voici une liste des différents modes d'ouverture d'un fichier:
r
rb
r+
rb+
w
wb
w+
wb+
un
ab
a+
ab+
w+
crée un nouveau fichier ou tronque un fichier existant, puis l'ouvre en lecture et écriture;r+
ouvre un fichier existant sans tronquer pour la lecture et l'écriture. Très différents.r
,w
, oua
sont exclusifs, maisb
peut être ajouté à tous ceux, comme on peut le+
, 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 fichier en Python
r
pour la lecturer+
s'ouvre pour la lecture et l'écriture (pas de tronquer un fichier)w
pour l'écriturew+
pour l'écriture et la lecture (peut tronquer un fichier)rb
pour la lecture d'un fichier binaire. Le pointeur de fichier est placé au début du fichier.rb+
de la lecture ou de l'écriture d'un fichier binairewb+
l'écriture d'un fichier binairea+
s'ouvre pour permettre l'ajoutab+
Ouvre un fichier pour les deux à l'ajout et à la lecture en binaire. Le pointeur de fichier à la fin du fichier si le fichier existe. Le fichier s'ouvre en mode d'ajout.x
ouvert pour la création exclusive, à défaut, si le fichier existe déjà (Python 3)rb
etwb
, pour ne pas mentionner leU
modes en 2.x et lat
mode 3.x (qui peut à la fois être combiné avec tout saufb
).wb+
également de lire le fichier?Le fichier est tronqué, de sorte que vous peut appel
read()
(pas d'exceptions soulevées, à la différence lors de l'ouverture à l'aide de "w"), mais vous obtiendrez une chaîne vide.Je soupçonne qu'il y a deux façons de gérer ce que je pense de vous r'cherche à atteindre.
1) ce qui est évident, c'est ouvrir le fichier en lecture seule, lecture en mémoire, puis ouvrir le fichier avec t, puis d'écrire vos modifications.
2) utiliser les fichiers de bas niveau de routines de gestion:
Espère que cela aide..
r+
En fait, il ya quelque chose de mal à propos de toutes les autres réponses sur
r+
mode.test.in
contenu du fichier:Et le py script :
De l'exécuter et de le
test.in
's le contenu sera modifié pour :Cependant, lorsque l'on modifie le script pour :
la
test.in
également faire de répondre:Donc, le
r+
mode va nous permettre de couvrir le contenu à partir du début si nous n'avons pas à faire l'opération de lecture. Et si nous ne une opération de lecture,f.write()
sera juste ajouter au fichier.Par ailleurs, si nous
f.seek(0,0)
avantf.write(write_content)
, le write_content va les couvrir de la position(0,0).Comme mentionné par h4z3,
Pour un usage pratique
Parfois, vos données est trop grande pour charger directement tout, ou si vous avez un générateur, ou en temps réel les données entrantes, vous pouvez utiliser w+ de stocker dans un fichier et le lire plus tard.