Confundido por el modo de archivo de Python “w +”

Desde el doc ,

Los modos ‘r +’, ‘w +’ y ‘a +’ abren el archivo para su actualización (tenga en cuenta que ‘w +’ trunca el archivo). Agregue ‘b’ al modo para abrir el archivo en modo binario, en sistemas que diferencian entre archivos binarios y de texto; en los sistemas que no tienen esta distinción, agregar la ‘b’ no tiene ningún efecto.

y aqui

w +: Abre un archivo para escribir y leer. Sobrescribe el archivo existente si el archivo existe. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

Pero, ¿cómo leer un archivo abierto con w+ ?

Digamos que está abriendo el archivo con una instrucción with como debería ser. Luego harías algo como esto para leer de tu archivo:

 with open('somefile.txt', 'w+') as f: # Note that f has now been truncated to 0 bytes, so you'll only # be able to read data that you write after this point f.write('somedata\n') f.seek(0) # Important: return to the top of the file before reading, otherwise you'll just read an empty string data = f.read() # Returns 'somedata\n' 

Tenga en cuenta f.seek(0) : si olvida esto, la llamada f.read() intentará leer desde el final del archivo y devolverá una cadena vacía.

Aquí hay una lista de los diferentes modos de abrir un archivo:

  • r

    Abre un archivo para leer solamente. El puntero del archivo se coloca al principio del archivo. Este es el modo por defecto.

  • rb

    Abre un archivo para leer solo en formato binario. El puntero del archivo se coloca al principio del archivo. Este es el modo por defecto.

  • r +

    Abre un archivo para leer y escribir. El puntero del archivo estará al principio del archivo.

  • rb +

    Abre un archivo para leer y escribir en formato binario. El puntero del archivo estará al principio del archivo.

  • w

    Abre un archivo solo para escritura. Sobrescribe el archivo si el archivo existe. Si el archivo no existe, crea un nuevo archivo para escribir.

  • wb

    Abre un archivo para escribir solo en formato binario. Sobrescribe el archivo si el archivo existe. Si el archivo no existe, crea un nuevo archivo para escribir.

  • w +

    Abre un archivo tanto para escribir como para leer. Sobrescribe el archivo existente si el archivo existe. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

  • wb +

    Abre un archivo para escritura y lectura en formato binario. Sobrescribe el archivo existente si el archivo existe. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

  • una

    Abre un archivo para anexar. El puntero del archivo se encuentra al final del archivo si el archivo existe. Es decir, el archivo está en el modo de adición. Si el archivo no existe, crea un nuevo archivo para escribir.

  • ab

    Abre un archivo para añadir en formato binario. El puntero del archivo se encuentra al final del archivo si el archivo existe. Es decir, el archivo está en el modo de adición. Si el archivo no existe, crea un nuevo archivo para escribir.

  • a +

    Abre un archivo tanto para añadir como para leer. El puntero del archivo se encuentra al final del archivo si el archivo existe. El archivo se abre en el modo de añadir. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

  • ab +

    Abre un archivo para añadir y leer en formato binario. El puntero del archivo se encuentra al final del archivo si el archivo existe. El archivo se abre en el modo de añadir. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

Todos los modos de archivo en Python

  • r para leer
  • r+ abre para leer y escribir (no se puede truncar un archivo)
  • w para escribir
  • w+ para escribir y leer (puede truncar un archivo)
  • rb para leer un archivo binario. El puntero del archivo se coloca al principio del archivo.
  • rb+ leyendo o escribiendo un archivo binario
  • wb+ escribiendo un archivo binario
  • a+ abre para añadir
  • ab+ Abre un archivo para agregar y leer en binario. El puntero del archivo se encuentra al final del archivo si el archivo existe. El archivo se abre en el modo de añadir.
  • x abierto para la creación exclusiva, fallando si el archivo ya existe (Python 3)

El archivo está truncado, por lo que puede llamar a read() (no se generan excepciones, a diferencia de cuando se abre con ‘w’) pero obtendrá una cadena vacía.

Sospecho que hay dos maneras de manejar lo que creo que estás tratando de lograr.

1) lo que es obvio, es abrir el archivo solo para leer, leerlo en la memoria, luego abrir el archivo con t, luego escribir los cambios.

2) usar las rutinas de manejo de archivos de bajo nivel:

 # Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC fd = os.open(filename, os.O_RDWR | os.O_CREAT) 

Espero que esto ayude..

En realidad, hay algo malo en todas las otras respuestas sobre el modo r+ .

contenido del archivo test.in

 hello1 ok2 byebye3 

Y el script de Py:

 with open("test.in", 'r+')as f: f.readline() f.write("addition") 

test.in y el contenido de test.in se cambiará a:

 hello1 ok2 byebye3 addition 

Sin embargo, cuando modificamos el script para:

 with open("test.in", 'r+')as f: f.write("addition") 

el test.in también responde:

 additionk2 byebye3 

Por lo tanto, el modo r+ nos permitirá cubrir el contenido desde el principio si no hicimos la operación de lectura. Y si hacemos alguna operación de lectura, f.write() simplemente se agregará al archivo.

Por cierto, si f.seek(0,0) antes de f.write(write_content) , write_content los cubrirá desde la posición (0,0).