Question open () dans Python ne crée pas de fichier s'il n'existe pas


Quel est le meilleur moyen d'ouvrir un fichier en lecture / écriture s'il existe, ou si ce n'est pas le cas, alors créez-le et ouvrez-le en lecture / écriture? De ce que j'ai lu, file = open('myfile.dat', 'rw') devrait le faire, non?

Ca ne marche pas pour moi (Python 2.6.2) et je me demande si c'est un problème de version, ou pas censé fonctionner comme ça ou quoi.

L'essentiel est que j'ai juste besoin d'une solution au problème. Je suis curieux au sujet des autres choses, mais tout ce dont j'ai besoin est une bonne façon de faire la première partie.

UPDATE: le répertoire englobant était inscriptible par l'utilisateur et le groupe, pas autre (je suis sur un système Linux ... donc les permissions 775 en d'autres termes), et l'erreur exacte était:

IOError: aucun fichier ou répertoire de ce type.


483
2018-06-03 15:05


origine


Réponses:


Tu devrais utiliser open avec le w+ mode:

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

618
2018-06-03 15:12



L’avantage de l’approche suivante est que le fichier est bien fermé à la fin du bloc, même si une exception est déclenchée. C'est équivalent à try-finally, mais beaucoup plus court.

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

un + Ouvre un fichier pour l'ajout et la lecture. Le pointeur de fichier est   à la fin du fichier si le fichier existe. Le fichier s'ouvre dans le   mode d'ajout Si le fichier n'existe pas, il crée un nouveau fichier pour   lire et écrire. -Modes de fichier 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
() .. one of ->
  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 de "rwa" - voir la question Stack Overflow Détail des modes de fichier Python.


97
2018-03-12 11:06



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

r + signifie lire / écrire


31
2018-06-03 15:18



La bonne pratique consiste à utiliser les éléments suivants:

import os

writepath = 'some/path/to/file.txt'

mode = 'a' if os.path.exists(writepath) else 'w'
with open(writepath, mode) as f:
    f.write('Hello, world!\n')

27
2018-05-04 01:49



Changer "rw" à "w +"

Ou utilisez 'a +' pour l'ajouter (sans effacer le contenu existant)


24
2018-06-03 15:12



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+')

13
2018-05-27 06:20



open('myfile.dat', 'a') travaille pour moi, très bien.

dans py3k votre code augmente ValueError:

>>> open('myfile.dat', 'rw')
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    open('myfile.dat', 'rw')
ValueError: must have exactly one of read/write/append mode

dans python-2.6 il soulève IOError.


7
2018-06-03 15:11



je pense que c'est r +, ne pas rw. Je suis juste un démarreur, et c'est ce que j'ai vu dans la documentation.


6
2018-06-22 12:16



Que voulez-vous faire avec le fichier? Seulement écrire ou lire et écrire?

'w', 'a' autorisera l'écriture et créera le fichier s'il n'existe pas.

Si vous avez besoin de lire à partir d'un fichier, le fichier doit exister avant de l'ouvrir. Vous pouvez tester son existence avant de l'ouvrir ou d'utiliser un try / except.


6
2018-06-03 15:29



Mettez w + pour écrire le fichier, tronqué s'il existe, r + pour lire le fichier, en créer un s'il n'existe pas mais pas écrire (et retourner null) ou un + pour créer un nouveau fichier ou l'ajouter à un existant.


5
2017-10-11 20:10



Depuis python 3.4 vous devrait utilisation pathlib pour "toucher" les fichiers.
C'est une solution beaucoup plus élégante que celles proposées dans ce fil.

from pathlib import Path

filename = Path('myfile.txt')
filename.touch(exist_ok=True)  # will create file, if it exists will do nothing
file = open(filename)

Même chose avec les répertoires:

filename.mkdir(parents=True, exist_ok=True)

5
2018-04-23 06:29