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+
?
Respuestas:
Digamos que está abriendo el archivo con una
with
declaración como debería ser. Entonces harías algo como esto para leer de tu archivo:Tenga en cuenta que
f.seek(0)
si olvida esto, laf.read()
llamada intentará leer desde el final del archivo y devolverá una cadena vacía.fuente
w+
"sobrescribirá el archivo existente si el archivo existe". Tan pronto como abra un archivo conw+
, 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 archivow+
. Si realmente desea leer los datos anteriores y agregarlos, debe usarlos enr+
lugar dew+
.Aquí hay una lista de los diferentes modos de abrir un archivo:
r
rb
r +
rb +
w
wb
w +
wb +
una
ab
a +
ab +
fuente
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.r
,w
oa
son exclusivos, perob
se pueden agregar a cualquiera de ellos, como se puede+
, oU
... Es una explosión combinatoria.rb
no 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#openTodos los modos de archivo en Python
r
para leerr+
se abre para leer y escribir (no se puede truncar un archivo)w
para la escrituraw+
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+
leer o escribir un archivo binariowb+
escribir un archivo binarioa+
se abre para agregarab+
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)fuente
rb
ywb
, sin mencionar losU
modos en 2.xy elt
modo en 3.x (que pueden combinarse con todo exceptob
).wb+
también se lee en el archivo?r
para leerw
para escribirr+
para leer / escribir sin eliminar el contenido original si el archivo existe, de lo contrario, generar una excepciónw+
para eliminar el contenido original y luego leer / escribir si el archivo existe, de lo contrario, cree el archivoPor ejemplo,
fuente
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.fuente
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:
Espero que esto ayude..
fuente
r+
En realidad, hay algo mal en todas las otras respuestas sobre el
r+
modo.test.in
contenido del archivo :Y el script py:
Ejecútelo y el
test.in
contenido de 's se cambiará a:Sin embargo, cuando modificamos el script para:
el
test.in
también lo hacen responden: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)
antesf.write(write_content)
, el contenido de escritura los cubrirá desde la posición (0,0).fuente
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.
fuente