2010-06-03 59 views
456

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

No funciona para mí (Python 2.6.2) y me pregunto si es un problema de versión, o no debería funcionar así o qué.

La conclusión es que solo necesito una solución para el problema. Tengo curiosidad sobre las otras cosas, pero todo lo que necesito es una buena manera de hacer la parte de apertura.

ACTUALIZACIÓN: el directorio contenedor era escribible por el usuario y de grupo, no otra (estoy en un sistema Linux ... lo que los permisos 775 en otras palabras), y el error exacto era:

IOError: no such file or directory.

+2

Como mencionó S.Mark, esto debería "solo funcionar". ¿Es el directorio adjunto escribible? – Rakis

+8

"no funciona para mí"? ¿Qué significa eso concretamente? Por favor ingrese el mensaje de error real. –

+4

La respuesta de muksie a continuación funcionó (y baloo también), pero para completar, el directorio adjunto era de escritura por usuario y grupo, no por otro (estoy en un sistema Linux ... así que los permisos 775 en otras palabras), y el el error exacto fue IOError: no existe tal archivo o directorio. Gracias por la ayuda chicos. – trh178

Respuesta

578

Debe utilizar file = open('myfile.dat', 'w+')

+73

'w' trunca el archivo existente. docs: * Los modos ''r + '',''w + ''y''a +' 'abren el archivo para actualizar (tenga en cuenta que''w + ''trunca el archivo). * – SilentGhost

+4

esto hizo el truco. gracias. Me siento como un idiota ahora por no leer las especificaciones. No creo que 'rw' sea incluso aceptable allí. Debo haber estado pensando en otra cosa. – trh178

+55

Tenga en cuenta que a + crea un archivo si no existe y, fundamentalmente, busca el archivo hasta el final. Entonces, si haces una lectura inmediatamente después de abrir de esta manera, no obtendrás nada. Primero debe volver al principio: f.seek (0) –

7

open('myfile.dat', 'a') funciona para mí, está bien.

en py3k su código plantea 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 se plantea IOError.

23

Cambio "rw" a "w +"

O uso 'a +' para añadir (no borrar el contenido existente)

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

r + medios de lectura/escritura

+38

Esto es Unpythonic. En lugar de [verificar si el archivo existe primero] (http://docs.python.org/3/glossary.html#term-lbyl), uno debe [asumir que primero, luego manejar el caso que no] (http://docs.python.org/3/glossary.html#term-eafp). –

+20

incluso peor, este código es propenso a una condición de carrera. por lo tanto, después de verificar si el archivo existe, el proceso podría interrumpirse y otro proceso podría crear este archivo. – antibus

6

¿Qué desea hacer con el archivo? ¿Solo escribiendo o leyendo o escribiendo?

'w', 'a' permitirá escribir y creará el archivo si no existe.

Si necesita leer un archivo, el archivo debe existir antes de abrirlo. Puedes probar su existencia antes de abrirlo o usar un try/except.

+3

Las pruebas de existencia antes de la apertura pueden introducir una condición de carrera. Probablemente no sea un gran problema en este caso, pero algo a tener en cuenta. –

+1

"Si necesita leer un archivo, el archivo debe existir antes de abrirlo". Gracias por salvar mi cordura. –

90

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

with open("file.dat","a+") as f: 
    f.write(...) 
    ... 

a+ Opens a file for both appending and reading. The file pointer is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing. - Python file modes

seek() method establece la posición actual del archivo.

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 

Only "rwab+" characters are allowed; there must be exactly one of "rwa" - see Stack Overflow question Python file modes detail.

+0

Intento esto con open (filename, 'a +') como miarchivo: y obtengo IOError: [Errno 2] No existe ese archivo o directorio: - ¿por qué no crea el archivo? – Loretta

+0

@Loretta ¿Ha comprobado el valor de 'filename'? – Qwerty

+0

Sí, lo hice. Es una cadena Unicode. También probé con open ('{}. Txt'.format (filename),' a + ') como myfile: – Loretta

7

creo que es r +, no RW. Solo soy un principiante, y eso es lo que he visto en la documentación.

11

Mi respuesta:

file_path = 'myfile.dat' 
try: 
    fp = open(file_path) 
except IOError: 
    # If not exists, create the file 
    fp = open(file_path, 'w+') 
4

Uso:

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 

Asegúrese de cerrar los archivos después de abrirlos. El administrador de contexto with hará esto por usted.

26

buena práctica consiste en 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') 
+5

Es malo probar un archivo antes de abrirlo, ya que puede conducir a condiciones de carrera (el archivo se elimina antes de abrirlo). Las condiciones de carrera a veces se pueden usar para explotar vulnerabilidades en un sistema. El modo "a +" es la mejor manera de abrir el archivo: crea un nuevo archivo y lo agrega a los archivos existentes. No te olvides de envolver esto en una prueba/excepto. – sleblanc

5

Put w + para escribir el archivo, truncar si existe, r + para leer el archivo, creando una si no existe, pero no escribir (y devolver nulo) o a + para crear un nuevo archivo o agregarlo a uno existente.

0

Entonces, ¿desea escribir datos en un archivo, pero solo si no existen?

Este problema se resuelve fácilmente utilizando el poco conocido modo x para abrir() en lugar del habitual modo w. Por ejemplo:

>>> 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 el archivo es de modo binario, use el modo xb en lugar de xt.

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

ejemplo:

file_name = 'my_file.txt' 
f = open(file_name, 'w+') # open file in write mode 
f.write('python rules') 
f.close() 

espero que esto ayude. [FYI estoy usando python versión 3.6.2

1

Si desea abrirlo para leer y escribir, supongo que no desea truncarlo al abrirlo y desea poder leer el archivo justo después de abrirlo. Esta es la solución que estoy usando:

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