linux 1, - open()dans Python ne crée pas de fichier s'il n'existe pas




<module> file (13)

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

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.


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

r + signifie lire / écrire


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


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


Si vous voulez l'ouvrir pour lire et écrire, je suppose que vous ne voulez pas le tronquer lorsque vous l'ouvrez et que vous voulez pouvoir lire le fichier juste après l'avoir ouvert. C'est donc la solution que j'utilise:

file = open('myfile.dat', 'a+')
file.seek(0, 0)

Remplacez "rw" par "w +"

Ou utilisez 'a +' pour l'ajouter (sans 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+')

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.


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)

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

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.


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 .


Et qu'en est-il de l'utilisation de Open XML SDK 2.0 pour Microsoft Office?

Quelques avantages:

  • Ne nécessite pas Office installé
  • Fait par Microsoft = documentation MSDN décent
  • Juste un. Net dll à utiliser dans le projet
  • SDK est livré avec de nombreux outils comme diff, validateur, etc

Liens:





python linux file-io file-permissions