956 votes

python open ne crée pas de fichier s'il n'existe pas

J'utilise Python.

Quelle est la meilleure façon d'ouvrir un fichier en rw s'il existe, ou s'il n'existe pas, de le créer et de l'ouvrir en rw ? D'après ce que j'ai lu, file = open('myfile.dat', 'rw') Cela ne fonctionne pas pour moi (python 2.6.2) et je me demande si c'est un problème de version, ou si ce n'est pas censé fonctionner comme ça ou quoi que ce soit.

En fin de compte, j'ai juste besoin d'une solution au problème. Je suis curieux de savoir ce qu'il y a d'autre, mais tout ce dont j'ai besoin, c'est d'une bonne façon de faire l'ouverture.

MISE À JOUR : le répertoire contenant le fichier était accessible en écriture par l'utilisateur et le groupe, et non par un autre (je suis sur un système Linux... donc permissions 775 en d'autres termes), et l'erreur exacte était IOError : no such file or directory.

2 votes

Comme S.Mark l'a mentionné, cela devrait "juste fonctionner". Le répertoire qui l'entoure est-il accessible en écriture ?

8 votes

La réponse de muksie ci-dessous a fonctionné (et celle de baloo aussi d'ailleurs), mais juste pour être complet, le répertoire qui l'entoure était accessible en écriture par l'utilisateur et le groupe, et non par un autre (je suis sur un système linux... donc permissions 775 en d'autres termes), et l'erreur exacte était IOError : no such file or directory. merci pour votre aide les gars.

4 votes

Assurez-vous que tous les éléments dossiers de la file existe.

1123voto

muksie Points 2945

Vous devez utiliser file = open('myfile.dat', 'w+')

167 votes

w tronque le fichier existant. docs : Modes 'r+' , 'w+' y 'a+' ouvrir le fichier pour le mettre à jour (notez que 'w+' tronque le fichier).

6 votes

Je me sens comme un idiot maintenant pour ne pas avoir lu les spécifications. Je ne pense pas que 'rw' soit même acceptable ici. Je devais penser à autre chose.

97 votes

Notez que a+ crée un fichier s'il n'existe pas et, surtout, cherche le fichier jusqu'à la fin. Donc si vous faites une lecture immédiatement après l'ouverture de cette façon, vous n'obtiendrez rien. Vous devez d'abord rechercher le début du fichier : f.seek(0)

207voto

Qwerty Points 1165

Ceci, si vous l'utilisez :

with open("file.dat","a+") as f:
    f.write(...)

a+ Ouvre un fichier pour l'ajouter et le lire. Le pointeur de fichier est à la fin du fichier si le fichier 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. lecture et l'écriture. - Modes de fichiers Python

méthode seek() définit la position actuelle du fichier.

f.seek(pos[,(0|1|2)])
pos .. position of the r/w pointer
[] .. optionally
0 .. absolute position
1 .. relative position to current
2 .. relative position from end

seuls les caractères "rwab+" sont autorisés ; il doit y avoir exactement un "rwa". - http://stackoverflow.com/a/656289/985454

3 votes

J'essaie ceci avec open(filename, 'a+') comme myfile : et j'obtiens IOError : [Errno 2] No such file or directory : - pourquoi le fichier n'est pas créé ?

0 votes

@Loretta Avez-vous vérifié la valeur de filename ?

0 votes

Oui, je l'ai fait. C'est une chaîne unicode. J'ai aussi essayé avec open('{}.txt'.format(filename), 'a+') comme myfile :

35voto

baloo Points 3146

Remplacer "rw" par "w+".

Ou utilisez "a+" pour ajouter (sans effacer le contenu existant).

29voto

Khorkrak Points 2009
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

r+ signifie lecture/écriture

60 votes

41 votes

Pire encore, ce code est sujet à une condition de course. ainsi, après avoir vérifié si le fichier existe, le processus pourrait être interrompu et un autre processus pourrait créer ce fichier.

0 votes

Vous aurez également besoin de l'indicateur "w+" pour que les deux fichiers soient en mode lecture et écriture.

11voto

Chien-Wei Huang Points 701

Ma réponse :

file_path = 'myfile.dat'
try:
    fp = open(file_path)
except IOError:
    # If not exists, create the file
    fp = open(file_path, 'w+')

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