recent - python importerror cannot import name




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

Quelle est la meilleure façon 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? D'après 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, j'ai juste besoin d'une solution pour le 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.


Depuis python 3.4, vous devez 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 répertoires:

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

Donc, vous voulez écrire des données dans un fichier, mais seulement si elles n'existent pas déjà?

Ce problème est facilement résolu en utilisant le mode x peu connu pour ouvrir () 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.


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 à la fois pour l'ajout et la lecture. 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. - Modes de fichier Python

La 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 question détails de modes de fichier Python .


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

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'essayer / sauf.


Remplacez "rw" par "w +"

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


Une bonne pratique consiste à utiliser ce qui suit:

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

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 fera cela pour vous.


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

dans python-2.6 il soulève IOError .


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

r + signifie lire / écrire





file-permissions