¿Cómo abrir un archivo para leer y escribir?

211

¿Hay alguna manera de abrir un archivo para leer y escribir?

Como solución alternativa, abro el archivo para escribir, lo cierro y luego lo vuelvo a leer. Pero hay una manera de abrir un archivo de tanto leer y escribir?

bigredhat
fuente
3
¿Qué problema estás resolviendo? tal vez hay una mejor solución que escribir / leer un archivo, por ejemplommap
Roman Bodnarchuk
1
¿Podría darnos su código para que podamos responderle? También puede intentar echar un vistazo: docs.python.org/tutorial/… . Sin embargo, he intentado usar r + b y funciona. ¿También hay algún beneficio en usar un descriptor de archivo en funciones diff?
Artsiom Rudzenka
@RomanBodnarchuk mmapes una gran idea, pero ¿qué pasa si tienes que lidiar con la concurrencia? ¿Hay alguna forma de reservar acceso?
Dr_Zaszuś

Respuestas:

267

Así es como lee un archivo y luego lo escribe (sobrescribiendo cualquier dato existente), sin cerrar y volver a abrir:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()
Flimm
fuente
41
use a+para cubrir el caso final de que el archivo no existe (será creado)
Jossef Harush
16
¡seek () y truncate () son críticos!
smwikipedia
44
@JossefHarush Tenga en cuenta que la documentación para los aestados 'en algunos sistemas Unix, significa que todas las escrituras se agregan al final del archivo, independientemente de la posición de búsqueda actual'. En este caso f.seek(0), no funcionará como se esperaba. Me caí mal de esto en Linux.
Graeme
66
Es mejor que expliques por qué seeky truncatese usa aquí. La mayoría de los lectores provienen de google y copian y pegan.
Shiplu Mokaddim
8
Después de leer el archivo, el puntero de archivo (fp) se ha movido hacia adelante, por lo que debe configurarlo al principio. Eso es lo que seek(0)hace: coloca la posición de fp 0( es decir, el comienzo). truncate()trunca el archivo al número de bytes proporcionado, es decir , elimina todo el contenido del archivo después del número de bytes especificado. Imagine que su archivo tiene la cadena Hello, worldy usted escribe Bye. Si no lo hace, truncate()el contenido al final será Byelo, world, ya que nunca eliminó el texto que existía en el archivo. truncate()trunca el archivo a la fp actual.
Illya Gerasymchuk
48

r+es el modo canónico para leer y escribir al mismo tiempo. Esto no es diferente de usar la fopen()llamada del sistema ya que file()/ open()es solo un pequeño contenedor alrededor de esta llamada del sistema operativo.

Andreas Jung
fuente
agrega contenido de archivo, no escribe desde el principio
TomSawyer
47

Resumir los comportamientos de E / S

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

y la rama de decisión

ingrese la descripción de la imagen aquí

Cálculo
fuente
¿Qué software usaste para hacer el diagrama de árbol?
Flujo
Yo también estaría interesado - Dia?
nerdoc
22

He intentado algo como esto y funciona como se esperaba:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Dónde:

f.read (tamaño): para leer el contenido de un archivo, llame a f.read (tamaño), que lee cierta cantidad de datos y lo devuelve como una cadena.

Y:

f.write (cadena) escribe el contenido de la cadena en el archivo, devolviendo Ninguno.

Además, si abre el tutorial de Python sobre la lectura y escritura de archivos , encontrará que:

'r +' abre el archivo para leer y escribir.

En Windows, 'b' agregado al modo abre el archivo en modo binario, por lo que también hay modos como 'rb', 'wb' y 'r + b'.

Artsiom Rudzenka
fuente
55
También leer y escribir funciona igualmente bien usando el modo 'r + b', pero debe usar f.seek (0) entre f.read () y f.write () para colocar el cursor de nuevo al comienzo del archivo.
Gaborous
2
Tenga en cuenta que si los datos que está escribiendo no son más largos que los datos que ya están allí, no se truncarán. Usa el truncatemétodo para detener esto.
Flimm