¿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?
¿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()
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.
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|||+|+||||Pointin the beginning |+|+|+|+||||Pointin the end |||||+|+|
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.
mmap
mmap
es una gran idea, pero ¿qué pasa si tienes que lidiar con la concurrencia? ¿Hay alguna forma de reservar acceso?Respuestas:
Así es como lee un archivo y luego lo escribe (sobrescribiendo cualquier dato existente), sin cerrar y volver a abrir:
fuente
a+
para cubrir el caso final de que el archivo no existe (será creado)a
estados '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 casof.seek(0)
, no funcionará como se esperaba. Me caí mal de esto en Linux.seek
ytruncate
se usa aquí. La mayoría de los lectores provienen de google y copian y pegan.seek(0)
hace: coloca la posición de fp0
( 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 cadenaHello, world
y usted escribeBye
. 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.r+
es el modo canónico para leer y escribir al mismo tiempo. Esto no es diferente de usar lafopen()
llamada del sistema ya quefile()
/open()
es solo un pequeño contenedor alrededor de esta llamada del sistema operativo.fuente
Resumir los comportamientos de E / S
y la rama de decisión
fuente
He intentado algo como esto y funciona como se esperaba:
Dónde:
Y:
Además, si abre el tutorial de Python sobre la lectura y escritura de archivos , encontrará que:
fuente
truncate
método para detener esto.