Confus par le mode de fichier python «w +»

201

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+?

holys
la source
27
J'ai trouvé ce diagramme très utile.
Ritwik

Réponses:

132

Supposons que vous ouvrez le fichier avec une withdéclaration comme vous devriez l'être. Ensuite, vous feriez quelque chose comme ceci pour lire à partir de votre fichier:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

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.

rmunn
la source
1
que signifie "tronquer à 0 octet"?
Nasif Imtiaz Ohi
22
@NasifImtiazOhi - Les documents Python disent que w+cela "écrasera le fichier existant s'il existe". Ainsi dès que vous ouvrez un fichier avec w+, 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 avec w+. Si vous vouliez réellement lire les données précédentes et les ajouter, vous devriez utiliser à la r+place de w+.
rmunn
comment ajouter de nouvelles données sur le dessus?
Beqa Bukhradze
1
@BeqaBukhradze - Si vous avez une question, cliquez sur le bouton "Poser une question", où elle sera vue par des centaines de personnes. Ne vous contentez pas de cliquer sur le bouton "Ajouter un commentaire" où seulement une ou deux personnes le verront.
rmunn
431

Voici une liste des différents modes d'ouverture d'un fichier:

  • r

    Ouvre un fichier en lecture seule. Le pointeur de fichier est placé au début du fichier. Il s'agit du mode par défaut.

  • rb

    Ouvre un fichier en lecture seule au format binaire. Le pointeur de fichier est placé au début du fichier. Il s'agit du mode par défaut.

  • r +

    Ouvre un fichier pour la lecture et l'écriture. Le pointeur de fichier sera au début du fichier.

  • rb +

    Ouvre un fichier pour la lecture et l'écriture au format binaire. Le pointeur de fichier sera au début du fichier.

  • w

    Ouvre un fichier en écriture uniquement. Remplace le fichier s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour l'écriture.

  • wb

    Ouvre un fichier pour l'écriture uniquement au format binaire. Remplace le fichier s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour l'écriture.

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

  • wb +

    Ouvre un fichier pour l'écriture et la lecture au format binaire. Remplace le fichier existant s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour la lecture et l'écriture.

  • une

    Ouvre un fichier à ajouter. Le pointeur de fichier se trouve à la fin du fichier s'il existe. Autrement dit, le fichier est en mode ajout. Si le fichier n'existe pas, il crée un nouveau fichier pour l'écriture.

  • un B

    Ouvre un fichier à ajouter au format binaire. Le pointeur de fichier se trouve à la fin du fichier s'il existe. Autrement dit, le fichier est en mode ajout. Si le fichier n'existe pas, il crée un nouveau fichier pour l'écriture.

  • a +

    Ouvre un fichier à ajouter et à lire. Le pointeur de fichier se trouve à la fin du fichier s'il existe. Le fichier s'ouvre en mode ajout. Si le fichier n'existe pas, il crée un nouveau fichier pour la lecture et l'écriture.

  • ab +

    Ouvre un fichier à ajouter et à lire au format binaire. Le pointeur de fichier se trouve à la fin du fichier s'il existe. Le fichier s'ouvre en mode ajout. Si le fichier n'existe pas, il crée un nouveau fichier pour la lecture et l'écriture.

Annuler
la source
donc à toutes fins intensives, r + et w + sont les mêmes?
Nick Humrich
21
@ Humdinger: Non, 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.
abarnert
En outre, comme avec la réponse de @ AlokAgarwal, cela prétend être une liste exhaustive des modes, mais ce n'est pas le cas.
abarnert
1
Il serait plutôt idiot de donner une liste exhaustive des modes, car ils fonctionnent plus comme une fonction à plusieurs paramètres. r,, wou asont exclusifs, mais bpeuvent être ajoutés à n'importe lequel d'entre eux, comme peut +, ou U... C'est une explosion combinatoire.
rmunn
4
rbn'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#open
iggy
158

Tous les modes de fichiers en Python

  • r à lire
  • r+ s'ouvre pour la lecture et l'écriture (ne peut pas tronquer un fichier)
  • w pour écrire
  • w+ pour l'écriture et la lecture (peut tronquer un fichier)
  • rbpour lire un fichier binaire. Le pointeur de fichier est placé au début du fichier.
  • rb+ lire ou écrire un fichier binaire
  • wb+ écrire un fichier binaire
  • a+ ouvre pour l'ajout
  • ab+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)
Alok Agarwal
la source
5
Ce ne sont pas tous les modes. Il néglige, par exemple, rbet wb, sans parler des Umodes en 2.x et du tmode en 3.x (qui peuvent tous les deux être combinés avec tout sauf b).
abarnert
1
La différence entre r + et w + est que w + tronque un fichier lorsqu'il est ouvert. Mais vous pouvez le tronquer manuellement dans les deux modes.
Martin
1
Cette réponse est inconstante avec celle donnée par @ 200 OK, par exemple wb+lit-elle aussi du fichier?
Celeritas
@Celeritas Le wb indique que le fichier est ouvert pour l'écriture en mode binaire. Sur les systèmes Unix (Linux, Mac OS X, etc.), le mode binaire ne fait rien - ils traitent les fichiers texte de la même manière que tous les autres fichiers. Sous Windows, cependant, les fichiers texte sont écrits avec des fins de ligne légèrement modifiées. Cela provoque un problème sérieux lors de la manipulation de fichiers binaires réels, tels que des fichiers exe ou jpg. Par conséquent, lorsque vous ouvrez des fichiers qui ne sont pas censés être du texte, même sous Unix, vous devez utiliser wb ou rb. Utilisez simplement w ou r uniquement pour les fichiers texte.
Alok Agarwal
En Python 3, il y a aussi le mode ouvert 'x': ouvert pour la création exclusive, échouant si le fichier existe déjà. Voir fonction ouverte dans le doc.
Laurent LAPORTE
9

r pour lire

w pour écrire

r+ pour lire / écrire sans supprimer le contenu d'origine si le fichier existe, sinon lever l'exception

w+ pour supprimer le contenu d'origine puis lire / écrire si le fichier existe, sinon créer le fichier

Par exemple,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$
GraceMeng
la source
2

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.

Elazar
la source
2

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:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

J'espère que cela t'aides..

Dory Zidon
la source
Alors r+
pourquoi
1

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:

hello1
ok2
byebye3

Et le script py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Exécutez-le et le test.incontenu de sera changé en:

hello1
ok2
byebye3
addition

Cependant, lorsque nous modifions le script pour:

with open("test.in", 'r+')as f:
    f.write("addition")

le test.infont aussi répondre:

additionk2
byebye3

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à fait f.write(write_content), le contenu en écriture les couvrira de la position (0,0).

Trouver
la source
0

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.

SmartManoj
la source