open() en Python no crea un archivo si no existe

Resuelto trh178 asked hace 14 años • 19 respuestas

¿Cuál es la mejor manera de abrir un archivo como lectura/escritura si existe, o si no existe, crearlo y abrirlo como lectura/escritura? Por lo que leí,file = open('myfile.dat', 'rw') debería hacer esto, ¿verdad?

No me funciona (Python 2.6.2) y me pregunto si es un problema de versión, o si se supone que no funciona así o qué.

El usuario y el grupo podían escribir en el directorio adjunto, no otros (estoy en un sistema Linux... en otras palabras, permisos 775), y el error exacto fue:

IOError: no such file or directory.
trh178 avatar Jun 03 '10 22:06 trh178
Aceptado

Debes usar opencon el w+modo:

file = open('myfile.dat', 'w+')
muksie avatar Jun 03 '2010 15:06 muksie

La ventaja del siguiente enfoque es que el archivo se cierra correctamente al final del bloque, incluso si se genera una excepción en el camino. Es equivalente a try-finally, pero mucho más corto.

with open("file.txt","a+") as f:
    f.write("Hello world!")
    f.seek(4)
    f.readline()
    ...

a+ Abre un archivo para agregarlo y leerlo. El puntero del archivo está al final del archivo si el archivo existe. El archivo se abre en el modo de agregar. Si el archivo no existe, crea un nuevo archivo para lectura y escritura. - Modos de archivo Python

El método seek() establece la posición actual del archivo.

por ejemplo f.seek(4, 0), con el contenido del archivo "¡Hola mundo!" "¡ Oh f.readline()mundo!"

f.seek(pos [, (0|1|2)])
pos .. Number. Position of the r/w pointer
[] .. optionally
() .. one of ->
  0 .. absolute position (default)
  1 .. relative position to current
  2 .. relative position from end

Sólo se permiten caracteres "rwab+"; debe haber exactamente uno de "rwa"; consulte los detalles de los modos de archivo Python de la pregunta de desbordamiento de pila .

Qwerty avatar Mar 12 '2013 11:03 Qwerty

Una buena práctica es utilizar lo siguiente:

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')
lollercoaster avatar May 04 '2015 01:05 lollercoaster

Desde Python 3.4 deberías usarlo pathlibpara "tocar" archivos.
Es una solución mucho más elegante que las propuestas en este hilo.

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)

Lo mismo con los directorios:

filename.mkdir(parents=True, exist_ok=True)
Granitosaurus avatar Apr 23 '2018 06:04 Granitosaurus