open() en Python no crea un archivo si no existe
¿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.
Debes usar open
con el w+
modo:
file = open('myfile.dat', 'w+')
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 .
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')
Desde Python 3.4 deberías usarlo pathlib
para "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)