Comment ouvrir un fichier en lecture et en écriture?

211

Existe-t-il un moyen d'ouvrir un fichier en lecture et en écriture?

Pour contourner ce problème, j'ouvre le fichier pour l'écriture, le ferme, puis l'ouvre à nouveau pour la lecture. Mais est - il un moyen d'ouvrir un fichier pour les deux lecture et l' écriture?

bigredhat
la source
3
quel problème vous résolvez? il y a peut-être une meilleure solution que d'écrire / lire un fichier, par exemplemmap
Roman Bodnarchuk
1
Pourriez-vous nous donner votre code afin que nous puissions vous répondre. Vous pouvez également essayer de jeter un œil: docs.python.org/tutorial/… . Cependant, j'ai essayé d'utiliser r + b et cela fonctionne. Y a-t-il également un avantage à utiliser un descripteur de fichier dans les fonctions diff?
Artsiom Rudzenka
@RomanBodnarchuk mmapest une excellente idée, mais que faire si vous devez gérer la concurrence? Existe-t-il un moyen de réserver l'accès?
Dr_Zaszuś

Réponses:

267

Voici comment lire un fichier, puis y écrire (en écrasant toutes les données existantes), sans fermer ni rouvrir:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()
Flimm
la source
41
utiliser a+pour couvrir le cas final que le fichier n'existe pas (sera créé)
Jossef Harush
16
search () et truncate () sont tous deux essentiels!
smwikipedia
4
@JossefHarush Notez que la documentation des aétats «sur certains systèmes Unix, signifie que toutes les écritures s'ajoutent à la fin du fichier quelle que soit la position de recherche actuelle». Dans ce cas, le f.seek(0)ne fonctionnera pas comme prévu. Je viens de tomber sous le coup de Linux.
Graeme
6
Il vaut mieux expliquer pourquoi seeket truncateest utilisé ici. La plupart des lecteurs viennent de Google et font du copier-coller.
Shiplu Mokaddim
8
Après avoir lu le fichier, le pointeur de fichier (fp) a avancé, vous devez donc le remettre au début. C'est ce qui seek(0)fait: il place le fp en position 0( c'est -à- dire le début). truncate()tronquer le fichier au nombre d'octets fourni, c'est -à- dire supprimer tout le contenu du fichier après le nombre d'octets spécifié. Imaginez que votre fichier ait la chaîne Hello, worldet que vous écrivez Bye. Si vous ne truncate()le faites pas, le contenu sera à la fin Byelo, world, car vous n'avez jamais supprimé le texte qui existait dans le fichier. truncate()tronque le fichier au fp actuel.
Illya Gerasymchuk
48

r+est le mode canonique pour lire et écrire en même temps. Ce n'est pas différent de l'utilisation de l' fopen()appel système car file()/ open()n'est qu'un minuscule wrapper autour de cet appel de système d'exploitation.

Andreas Jung
la source
il ajoute le contenu du fichier, pas l'écriture depuis le début
TomSawyer
47

Résumer les comportements d'E / S

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

et la branche décision

entrez la description de l'image ici

Calcul
la source
Quel logiciel avez-vous utilisé pour créer l'arborescence?
Flux
Ça m'intéresserait aussi - Dia?
nerdoc
22

J'ai essayé quelque chose comme ça et cela fonctionne comme prévu:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Où:

f.read (taille) - Pour lire le contenu d'un fichier, appelez f.read (taille), qui lit une certaine quantité de données et la renvoie sous forme de chaîne.

Et:

f.write (string) écrit le contenu de la chaîne dans le fichier, retournant None.

Aussi, si vous ouvrez un didacticiel Python sur la lecture et l'écriture de fichiers vous constaterez que:

'r +' ouvre le fichier en lecture et en écriture.

Sous Windows, «b» ajouté au mode ouvre le fichier en mode binaire, il existe donc également des modes comme «rb», «wb» et «r + b».

Artsiom Rudzenka
la source
5
La lecture puis l'écriture fonctionnent également bien en utilisant le mode 'r + b', mais vous devez utiliser f.seek (0) entre f.read () et f.write () pour replacer le curseur au début du fichier.
gaborous
2
Notez que si les données que vous écrivez ne sont pas plus longues que les données déjà présentes, elles ne seront pas tronquées. Utilisez letruncate méthode pour arrêter cela.
Flimm