Quel est le meilleur moyen d'ouvrir un fichier en lecture/écriture s'il existe ou non, de le créer et de l'ouvrir en lecture/écriture? D'après ce que j'ai lu, file = open('myfile.dat', 'rw')
devrait le faire, non?
Cela ne fonctionne pas pour moi (Python 2.6.2) et je me demande si c'est un problème de version, ou pas supposé fonctionner comme ça ou quoi.
En bout de ligne, j'ai juste besoin d'une solution au problème. Je suis curieux des autres choses, mais tout ce dont j'ai besoin, c’est d’une belle façon de faire la première partie.
UPDATE: le répertoire qui l'entourait était accessible en écriture par utilisateur et par groupe, et non par un autre (je suis sur un système Linux ... donc autorisations 775 en d'autres termes), et l'erreur exacte était:
IOError: aucun fichier ni répertoire de ce type.
Vous devriez utiliser open
avec le mode w+
:
file = open('myfile.dat', 'w+')
L’avantage de l’approche suivante est que le fichier est correctement fermé à la fin du bloc, même si une exception est levée en cours de route. C'est équivalent à try-finally
, mais beaucoup plus court.
with open("file.dat","a+") as f:
f.write(...)
...
a + Ouvre un fichier pour l'ajout et la lecture. Le pointeur de fichier est à la fin du fichier s'il existe. Le fichier s'ouvre dans le mode annexe. 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 l'un des "rwa" - voir la question relative au débordement de pile Détail des modes de fichier Python.
>>> import os
>>> if os.path.exists("myfile.dat"):
... f = file("myfile.dat", "r+")
... else:
... f = file("myfile.dat", "w")
r + signifie lecture/écriture
Une 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')
Changer "rw" en "w +"
Ou utilisez 'a +' pour ajouter (ne pas effacer le contenu existant)
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+')
open('myfile.dat', 'a')
fonctionne 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
en python-2.6, il lève IOError
.
Je pense que c'est r + , pas rw . Je ne suis qu'un débutant, et c'est ce que j'ai vu dans la documentation.
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 utiliser try/except.
Mettez w + pour écrire le fichier, tronquez-le s'il existe, r + pour le lire, créez-en un s'il n'existe pas mais n'écrivez pas (et renvoyez null) ou un + pour créer un nouveau fichier ou ajouter un fichier existant.
'''
w write mode
r read mode
a append mode
w+ create file if it doesn't exist and open it in write mode
r+ create file if it doesn't exist and open it in read mode
a+ create file if it doesn't exist and open it in append mode
'''
exemple:
file_name = 'my_file.txt'
f = open(file_name, 'w+') # open file in write mode
f.write('python rules')
f.close()
J'espère que ça aide. [FYI utilise python version 3.6.2
Depuis python 3.4, vous devriez utiliser 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 annuaires:
filename.mkdir(parents=True, exist_ok=True)
Si vous voulez l'ouvrir pour le lire et l'écrire, je suppose que vous ne voulez pas le tronquer lorsque vous l'ouvrez et que vous voulez pouvoir lire le fichier tout de suite après l'avoir ouvert. Donc voici la solution que j'utilise:
file = open('myfile.dat', 'a+')
file.seek(0, 0)
Utilisation:
import os
f_loc = r"C:\Users\Russell\Desktop\ip_addr.txt"
if not os.path.exists(f_loc):
open(f_loc, 'w').close()
with open(f_loc) as f:
#Do stuff
Assurez-vous de fermer les fichiers après les avoir ouverts. Le gestionnaire de contexte with
le fera pour vous.
import os, platform
os.chdir('c:\\Users\\MS\\Desktop')
try :
file = open("Learn Python.txt","a")
print('this file is exist')
except:
print('this file is not exist')
file.write('\n''Hello Ashok')
fhead = open('Learn Python.txt')
for line in fhead:
words = line.split()
print(words)
Donc, vous voulez écrire des données dans un fichier, mais seulement s’il n’existe pas déjà ?.
Ce problème est facilement résolu en utilisant le mode x peu connu open () au lieu du mode w habituel. Par exemple:
>>> with open('somefile', 'wt') as f:
... f.write('Hello\n')
...
>>> with open('somefile', 'xt') as f:
... f.write('Hello\n')
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'somefile'
>>>
Si le fichier est en mode binaire, utilisez le mode xb au lieu de xt.