Confundido por el modo de archivo de python "w +"

201

Del doc ,

Los modos 'r +', 'w +' y 'a +' abren el archivo para actualizarlo (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 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+?

holys
fuente
27
Encontré este diagrama bastante útil.
Ritwik

Respuestas:

132

Digamos que está abriendo el archivo con una withdeclaración como debería ser. Entonces 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 que f.seek(0)si olvida esto, la f.read()llamada intentará leer desde el final del archivo y devolverá una cadena vacía.

rmunn
fuente
1
¿Qué significa "truncar a 0 bytes"?
Nasif Imtiaz Ohi
22
@NasifImtiazOhi: los documentos de Python dicen que w+"sobrescribirá el archivo existente si el archivo existe". Tan pronto como abra un archivo con w+, ahora es un archivo vacío: contiene 0 bytes. Si solía contener datos, esos datos se han truncado, cortado y desechado, y ahora el tamaño del archivo es de 0 bytes, por lo que no puede leer ninguno de los datos que existían antes de abrir el archivo w+. Si realmente desea leer los datos anteriores y agregarlos, debe usarlos en r+lugar de w+.
rmunn
¿Cómo agregar nuevos datos en la parte superior?
Beqa Bukhradze 01 de
1
@BeqaBukhradze: si tiene una pregunta, haga clic en el botón "Hacer una pregunta", donde cientos de personas la verán. No solo haga clic en el botón "Agregar comentario" donde solo una o dos personas lo verán.
rmunn
431

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

  • r

    Abre un archivo para lectura 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 comienzo del archivo.

  • rb +

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

  • w

    Abre un archivo para escribir solo. 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 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.

  • wb +

    Abre un archivo para escribir y leer 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 está al final del archivo si el archivo existe. Es decir, el archivo está en el modo agregar. Si el archivo no existe, crea un nuevo archivo para escribir.

  • ab

    Abre un archivo para agregarlo en formato binario. El puntero del archivo está al final del archivo si el archivo existe. Es decir, el archivo está en el modo agregar. Si el archivo no existe, crea un nuevo archivo para escribir.

  • a +

    Abre un archivo para agregar y leer. El puntero del archivo está al final del archivo si el archivo existe. El archivo se abre en el modo agregar. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

  • ab +

    Abre un archivo para agregar y leer en formato binario. El puntero del archivo está al final del archivo si el archivo existe. El archivo se abre en el modo agregar. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

Anular
fuente
entonces, para todos los propósitos intensivos, r + y w + son iguales?
Nick Humrich
21
@Humdinger: No, w+crea un nuevo archivo o trunca un archivo existente, luego lo abre para leer y escribir; r+abre un archivo existente sin truncarlo para leer y escribir. Muy diferente.
abarnert
Además, al igual que con la respuesta de @ AlokAgarwal, esta afirma ser una lista exhaustiva de modos, pero no lo es.
abarnert
1
Sería bastante tonto dar una lista exhaustiva de modos, ya que funcionan más como una función con múltiples parámetros. r, wo ason exclusivos, pero bse pueden agregar a cualquiera de ellos, como se puede +, o U... Es una explosión combinatoria.
rmunn
44
rbno es el modo predeterminado, cita: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy
158

Todos los modos de archivo en Python

  • r para leer
  • r+ se abre para leer y escribir (no se puede truncar un archivo)
  • w para la escritura
  • w+ para escribir y leer (puede truncar un archivo)
  • rbpara leer un archivo binario. El puntero del archivo se coloca al principio del archivo.
  • rb+ leer o escribir un archivo binario
  • wb+ escribir un archivo binario
  • a+ se abre para agregar
  • ab+Abre un archivo para agregar y leer en binario. El puntero del archivo está al final del archivo si el archivo existe. El archivo se abre en el modo agregar.
  • x abierto para creación exclusiva, falla si el archivo ya existe (Python 3)
Alok Agarwal
fuente
55
Esto no es todos los modos. Descuida, por ejemplo, rby wb, sin mencionar los Umodos en 2.xy el tmodo en 3.x (que pueden combinarse con todo excepto b).
abarnert
1
La diferencia entre r + y w + es que w + trunca un archivo cuando se abre. Pero puede truncarlo manualmente en ambos modos.
Martin
1
Esta respuesta es incompatible con la dada por @ 200 OK, por ejemplo, ¿ wb+también se lee en el archivo?
Celeritas
@Celeritas El wb indica que el archivo está abierto para escritura en modo binario. En los sistemas Unix (Linux, Mac OS X, etc.), el modo binario no hace nada: tratan los archivos de texto de la misma manera que cualquier otro archivo. Sin embargo, en Windows, los archivos de texto se escriben con finales de línea ligeramente modificados. Esto causa un problema grave cuando se trata de archivos binarios reales, como archivos exe o jpg. Por lo tanto, al abrir archivos que se supone que no son texto, incluso en Unix, debe usar wb o rb. Use wor simple solo para archivos de texto.
Alok Agarwal
En Python 3, también está el modo abierto 'x': abierto para creación exclusiva, fallando si el archivo ya existe. Ver función abierta en el doc.
Laurent LAPORTE
9

r para leer

w para escribir

r+ para leer / escribir sin eliminar el contenido original si el archivo existe, de lo contrario, generar una excepción

w+ para eliminar el contenido original y luego leer / escribir si el archivo existe, de lo contrario, cree el archivo

Por ejemplo,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$
GraceMeng
fuente
2

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

Elazar
fuente
2

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

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

2) use 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..

Dory Zidon
fuente
Entonces, ¿para qué? r+
SmartManoj
1

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

test.in contenido del archivo :

hello1
ok2
byebye3

Y el script py:

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

Ejecútelo y el test.incontenido de 's 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.intambién lo hacen responden:

additionk2
byebye3

Entonces, el r+modo 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() solo se agregará al archivo.

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

Encontrar
fuente
0

Como lo menciona h4z3 , para un uso práctico, a veces sus datos son demasiado grandes para cargar todo directamente, o si tiene un generador o datos entrantes en tiempo real, puede usar w + para almacenar en un archivo y leer más tarde.

SmartManoj
fuente