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.

2voto

Elazar Points 6342

Le fichier est tronqué, donc vous pouvez appeler read() (aucune exception n'est levée, contrairement à l'ouverture avec 'w') mais vous obtiendrez une chaîne vide.

2voto

Dory Zidon Points 3069

Je suppose qu'il existe deux façons de gérer ce que je pense que vous essayez de réaliser.

1) qui est évident, 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 manipulation de fichiers de bas niveau:

# Ouvrez le fichier en RW, créez-le s'il n'existe pas. *Ne* passez pas O_TRUNC
 fd = os.open(nom_fichier, os.O_RDWR | os.O_CREAT)

J'espère que cela vous aidera..

0 votes

Ensuite, que signifie r+ ?

2voto

Find Points 55

En fait, il y a quelque chose qui cloche dans toutes les autres réponses concernant le mode r+.

Contenu du fichier test.in

hello1
ok2
byebye3

Et le script py :

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

Exécutez-le et le contenu de test.in sera modifié en :

hello1
ok2
byebye3
addition

Cependant, lorsque nous modifions le script en :

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

le fichier test.in répondra également :

additionk2
byebye3

Ainsi, le mode r+ nous permettra de remplacer le contenu depuis le début si nous n'avons pas effectué d'opération de lecture. Et si nous effectuons une opération de lecture, f.write() se contentera d'ajouter à la fin du fichier.

En passant, si nous faisons un f.seek(0, 0) avant f.write(contenu), le contenu écrit remplacera celui depuis la position (0, 0).

1voto

Snehal Vibhute Points 59

Voici la liste qui pourrait être utile

Caractère Sens

'r' - ouvrir en lecture (par défaut)

'w' - ouvrir en écriture, en tronquant le fichier au préalable

'x' - ouvrir en création exclusive, en échouant si le fichier existe déjà

'a' - ouvrir en écriture, en ajoutant à la fin du fichier s'il existe

'b' - mode binaire

't' - mode texte (par défaut)

'+' - ouvrir pour mise à jour (lecture et écriture)

Le mode par défaut est 'r' (ouverture en lecture texte, synonyme de 'rt'). Les modes 'w+' et 'w+b' ouvrent et tronquent le fichier. Les modes 'r+' et 'r+b' ouvrent le fichier sans troncature.

Référence: https://docs.python.org/3/library/functions.html#open

1voto

Andrew Anderson Points 395

J'étais aussi très confus... Mais peut-être que ma réponse aidera quelqu'un. Je suppose que vous voulez tirer parti de la capacité du mode 'w+' pour créer le fichier s'il n'existe pas.

En effet, seuls w, w+, a, a+ peuvent créer le fichier s'il n'existe pas.

Mais si vous avez besoin de lire les données du fichier (dans le scénario où le fichier avec des données existait), vous ne pouvez pas le faire avec w+ tel quel car il tronque le fichier. Oups, ce n'est pas ce que vous vouliez dire !

Donc, probablement, votre meilleur ami serait a+ avec file.seek(0) :

with open('somefile.txt', 'a+') as f:
    f.seek(0)
    for line in f:
        print(f.readline())

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