web-dev-qa-db-fra.com

Confus par python mode de fichier "w +"

Depuis le 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 des systèmes différenciant 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. Ecrase 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+?

167
holys

Disons que vous ouvrez le fichier avec une instruction with comme vous devriez l'être. Ensuite, vous feriez quelque chose comme ceci à lire dans 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'appel f.read() essaiera de lire à partir de la fin du fichier et retournera une chaîne vide.

109
rmunn

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

  • r

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

  • rb

    Ouvre un fichier en lecture uniquement au 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 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. Ecrase le fichier s'il existe. Si le fichier n'existe pas, crée un nouveau fichier à écrire.

  • wb

    Ouvre un fichier en écriture uniquement au format binaire. Ecrase le fichier s'il existe. Si le fichier n'existe pas, crée un nouveau fichier à écrire.

  • w +

    Ouvre un fichier pour l’écriture et la lecture. Ecrase 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. Ecrase 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 est à la fin du fichier si le fichier existe. C'est-à-dire que le fichier est en mode ajout. Si le fichier n'existe pas, il crée un nouveau fichier à écrire.

  • un B

    Ouvre un fichier à ajouter au format binaire. Le pointeur de fichier est à la fin du fichier si le fichier existe. C'est-à-dire que le fichier est en mode ajout. Si le fichier n'existe pas, il crée un nouveau fichier à écrire.

  • un +

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

355
Nullify

Tous les modes de fichiers en Python

  • r pour la lecture
  • r+ s'ouvre en lecture et en écriture (impossible de 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+ lecture ou écriture d'un fichier binaire
  • wb+ écriture d'un fichier binaire
  • a+ s'ouvre pour ajouter
  • ab+ Ouvre un fichier à ajouter et à lire en binaire. Le pointeur de fichier est à la fin du fichier si le fichier existe. Le fichier s'ouvre en mode d'ajout.
  • x ouvert pour création exclusive, échec si le fichier existe déjà (Python 3)
131
Alok Agarwal

Le fichier est tronqué, de sorte que vous pouvez appeler read() (aucune exception ne sera déclenchée, contrairement à l'ouverture avec "w"), mais vous obtiendrez une chaîne vide.

2
Elazar

Je soupçonne qu’il ya deux façons de gérer ce que je pense que vous essayez d’atteindre.

1) ce qui est évident, c’est ouvrir le fichier en lecture seule, lisez-le en mémoire puis ouvrez le fichier avec t, puis écrivez vos modifications.

2) utilisez les routines de gestion de fichier 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..

1
Dory Zidon

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

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 contenu de test.in sera remplacé par:

hello1
ok2
byebye3
addition

Cependant, lorsque nous modifions le script pour:

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

le test.in fait aussi la réponse:

additionk2
byebye3

Donc, le mode r+ nous permettra de couvrir le contenu depuis le début si nous n’avons pas fait la lecture. Et si nous effectuons une opération de lecture, f.write()s'ajoute simplement au fichier.

À propos, si nous f.seek(0,0) avant f.write(write_content), le contenu en écriture les couvrira à partir de la position (0,0).

1
Find

Comme mentionné par h4z , Pour une utilisation pratique, vos données sont parfois 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.

0
SmartManoj

r pour lire

w pour écrire

r+ pour lire/écrire sans supprimer le contenu d'origine si le fichier existe, sinon lever 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 "<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
$
0
GraceMeng