web-dev-qa-db-fra.com

open () en 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 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.

529
trh178

Vous devriez utiliser open avec le mode w+:

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

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.

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

r + signifie lecture/écriture

32
Khorkrak

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')
31
lollercoaster

Changer "rw" en "w +"

Ou utilisez 'a +' pour ajouter (ne pas effacer le contenu existant)

26
baloo

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+')
14
Chien-Wei Huang

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.

7
SilentGhost

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.

6
Angel Poppy

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.

6
user49117

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.

5
Gustavo6046
'''
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

5
Gajendra D Ambi

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)
5
Granitosaurus

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)
4

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.

4
Mr. Me
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)
1
Ganesh Jat

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.

0
njoshsn