273 votes

Confus par le mode de fichier python "w+"

À partir du doc,

Les modes 'r+', 'w+' et 'a+' ouvrent le fichier pour mise à jour (remarquez que 'w+' tronque le fichier). Ajoutez 'b' au mode pour ouvrir le fichier en mode binaire, sur les systèmes qui font la distinction entre fichiers binaires et fichiers texte; sur les systèmes qui n'ont pas cette distinction, ajouter le 'b' n'a aucun effet.

et ici

w+ : Ouvre un fichier pour écriture et lecture. Écrase 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+?

35 votes

J'ai trouvé ce diagramme très utile.

550voto

Kousik Chowdhury Points 1524

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. C'est le mode par défaut.

  • rb

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

  • r+

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

  • rb+

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

  • w

    Ouvre un fichier pour écriture seulement. Écrase le fichier s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour l'écriture.

  • wb

    Ouvre un fichier pour écriture seulement en format binaire. Écrase le fichier s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour l'écriture.

  • w+

    Ouvre un fichier pour écriture et lecture. Écrase 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 écriture et lecture en format binaire. Écrase le fichier existant s'il existe. Si le fichier n'existe pas, crée un nouveau fichier pour la lecture et l'écriture.

  • a

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

  • ab

    Ouvre un fichier pour ajouter du contenu en format binaire. Le pointeur de fichier est à la fin du fichier s'il existe. C'est-à-dire, 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 pour à la fois ajouter du contenu et lire. Le pointeur de fichier est à la fin du fichier s'il existe. Le fichier s'ouvre en mode ajout. Si le fichier n'existe pas, crée un nouveau fichier pour la lecture et l'écriture.

  • ab+

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

0 votes

Pour toutes les fins utiles, r+ et w+ sont les mêmes ?

30 votes

@Humdinger : Non, w+ crée un nouveau fichier ou tronque un fichier existant, puis l'ouvre en lecture et en écriture; r+ ouvre un fichier existant sans le tronquer en lecture et en écriture. Très différent.

1 votes

Aussi, comme avec la réponse de @AlokAgarwal, cela prétend être une liste exhaustive de modes, mais ne l'est pas.

171voto

Alok Agarwal Points 869

Tous les modes de fichier en Python

  • r pour la lecture
  • r+ ouvre pour la lecture et l'écriture (ne peut pas tronquer un fichier)
  • w pour l'écriture
  • w+ 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 binaire
  • wb+ écrire un fichier binaire
  • a+ ouvre pour ajouter
  • ab+ Ouvre un fichier pour ajouter et lire en binaire. Le pointeur de fichier est à la fin du fichier si le fichier existe. Le fichier s'ouvre en mode append.
  • x ouvert pour une création exclusive, échouant si le fichier existe déjà (Python 3)

5 votes

Ce ne sont pas tous les modes. Il néglige, par exemple, rb et wb, sans parler des modes U en 2.x et du mode t en 3.x (qui peuvent tous deux être combinés avec tout sauf b).

1 votes

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.

2 votes

Cette réponse est inconstante avec celle donnée par @200 OK, par exemple est-ce que wb+ lit aussi à partir du fichier ?

167voto

rmunn Points 2576

Supposons que vous ouvrez le fichier avec une déclaration with comme vous le devriez. Ensuite, vous feriez quelque chose comme ceci pour lire à partir de votre fichier :

with open('somefile.txt', 'w+') as f:
    # Notez que f a maintenant été tronqué à 0 octets, donc vous ne pourrez lire que les données que vous écrivez après ce point
    f.write('quelquesdonnees\n')
    f.seek(0)  # Important : revenir en haut du fichier avant de lire, sinon vous lirez simplement une chaîne vide
    data = f.read() # Retourne 'quelquesdonnees\n'

Remarquez le f.seek(0) - si vous oubliez cela, l'appel à f.read() essaiera de lire à partir de la fin du fichier, et renverra une chaîne vide.

3 votes

Qu'est-ce que cela signifie "tronquer à 0 octets" ?

31 votes

@NasifImtiazOhi - Les documents Python disent que w+ va "écraser le fichier existant si le fichier existe". Ainsi, dès que vous ouvrez un fichier avec w+, il s'agit maintenant d'un fichier vide : il contient 0 octets. 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, donc vous ne pouvez pas lire les données qui existaient avant d'avoir ouvert le fichier avec w+. Si vous vouliez en fait lire les données précédentes et y ajouter, vous devriez utiliser r+ au lieu de w+.

0 votes

Comment ajouter de nouvelles données en haut ?

16voto

GraceMeng Points 599

r pour lire

w pour écrire

r+ pour lire/écrire sans supprimer le contenu d'origine si le fichier existe, sinon générer une 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 "", line 1, in 
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
$

7voto

Les deux semblent fonctionner de manière identique mais il y a une accroche.

r+ :-

  • Ouvrir le fichier pour Lecture et Ecriture
  • Une fois ouvert, le pointeur de fichier pointera au début (0)
  • Maintenant si vous voulez lire, cela commencera la lecture depuis le début
  • Si vous voulez écrire, alors commencez à écrire, mais le processus d'écriture commencera à partir du pointeur 0. Donc il y aura écrasement de caractères, s'il y en a
  • Dans ce cas, le fichier doit être présent, sinon une FileNotFoundError sera levée.

w+ :-

  • Ouvrir le fichier pour Lecture et Ecriture
  • Si le fichier existe, il sera ouvert et toutes les données seront effacées
  • Si le fichier n'existe pas, alors un nouveau fichier sera créé
  • Au début, le pointeur de fichier pointera au début (comme il n'y a pas de données)
  • Maintenant si vous voulez écrire quelque chose, alors écrivez
  • Le pointeur de fichier pointera maintenant à la fin du fichier (après le processus d'écriture)
  • Si vous voulez lire les données maintenant, déplacez-vous vers un point spécifique (pour commencer : seek(0))

Donc, en résumé, les deux sont destinés à ouvrir le fichier pour lire et écrire mais la différence est si nous voulons effacer les données au début puis faire de la lecture/écriture ou simplement commencer tel quel.

abc.txt - au début

1234567
abcdefg
0987654
1234

Code pour r+

with open('abc.txt', 'r+') as f:      # abc.txt doit exister avant l'ouverture
    print(f.tell())                   # Doit donner ==> 0
    f.write('abcd')                   
    print(f.read())                   # Le pointeur pointe vers l'index 3 => 4e position
    f.write('Sunny')                  # Après la lecture, le pointeur est à la fin du fichier

Sortie

0
567
abcdefg
0987654
1234

abc.txt - Après l'exécution:

abcd567
abcdefg
0987654
1234Sunny

Réinitialisation de abc.txt comme initial

Code pour w+

with open('abc.txt', 'w+') as f:     
    print(f.tell())                   # Doit donner ==> 0
    f.write('abcd')                   
    print(f.read())                   # Le pointeur pointe vers l'index 3 => 4e position
    f.write('Sunny')                  # Après la lecture, le pointeur est à la fin du fichier

Sortie

0

abc.txt - Après l'exécution:

abcdSunny

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X