¿Diferencia entre los modos a, a +, w, w + y r + en la función abierta incorporada?

610

En la pitón incorporada abierta función, ¿cuál es la diferencia exacta entre los modos w, a, w+, a+, y r+?

En particular, la documentación implica que todo esto permitirá escribir en el archivo, y dice que abre los archivos para "agregar", "escribir" y "actualizar" específicamente, pero no define lo que significan estos términos.

flybywire
fuente
11
El enlace que proporcionó define exactamente los valores. ¿Qué parte del enlace que proporcionó podría no ver o comprender? ¿Podría aclarar su pregunta para explicar lo que no entendió sobre el enlace?
S.Lott
@ChrisB. - Informé
Bulwersator
2
¿no hay un documento simple y único que explique lo que significa el signo +?
Charlie Parker

Respuestas:

740

Los modos de apertura son exactamente los mismos que para la función de biblioteca estándar C fopen() .

La página de fopenmanual de BSD los define de la siguiente manera:

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.
drAlberT
fuente
3
Creo que te refieres a la llamada fopen en la biblioteca estándar de C (que no es una llamada al sistema)
Eli Courtwright
15
NOTA: Python v3 agrega varios modos adicionales. enlace a documentos
Alex
55
Notó eso wy w+ambos pueden hacerloThe file is created if it does not exist
Wei Yang
44
En Windows, banexa al modo se abre el archivo en modo binario, por lo que también son modos como rb, wb, y r+b. Python en Windows distingue entre archivos de texto y binarios; Los caracteres de fin de línea en los archivos de texto se alteran automáticamente ligeramente cuando se leen o escriben los datos.
66
¿tengo razón al decir que +no hace algo consistente independientemente si lo es a, wo r? ¿O no veo el patrón? ¿Cuál es el patrón?
Charlie Parker
510

Me di cuenta de que de vez en cuando necesito buscar nuevamente en Google, solo para construir una imagen mental de cuáles son las principales diferencias entre los modos. Entonces, pensé que un diagrama sería más rápido de leer la próxima vez. Tal vez alguien más lo encuentre útil también.

Andrzej Pronobis
fuente
3
La adescripción es incorrecta . Las escrituras siempre se colocan al final.
Antti Haapala
10
@Y creo que @Antti se refiere a la propiedad Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similarque es algo más fuerte que solo decir que la posición inicial es el final.
jcai
8
@CharlieParker Que básicamente hay dos operaciones de archivo (lectura, escritura). El modo r es principalmente para lectura, los modos w , a son principalmente para escritura. Y el signo más habilita la segunda operación para un modo dado (simplemente dicho).
Jeyekomon
22
Para la posteridad: truncar significa sobrescribir desde el principio.
Minh Tran
44
@Jeyekomon ¡Su resumen en su comentario aquí es probablemente la cosa más útil que he leído al tratar de entender estos modos de una manera que ahora puedo recordar! El diagrama de flujo en esta respuesta es hermoso y la tabla en la respuesta a continuación es excelente, pero si estas respuestas (y otras en otros lugares) comenzaron con este simple punto y funcionaron desde allí, ayudaría a proporcionar un marco mental mucho mejor para colgar los detalles en. Así que gracias. (Soy consciente de que esto puede estar al borde del spam, pero sentí que tu comentario merecía reconocimiento) 💯
Tim
206

La misma información, solo en forma de tabla

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

donde los significados son: (solo para evitar cualquier interpretación errónea)

  • leer: se permite leer del archivo
  • escribir: se permite escribir en el archivo

  • crear: el archivo se crea si aún no existe

  • trunctate: durante la apertura del archivo se vacía (se borra todo el contenido del archivo)

  • posición al inicio: después de abrir el archivo, la posición inicial se establece al inicio del archivo

  • posición al final: después de abrir el archivo, la posición inicial se establece al final del archivo

Nota: ay a+siempre agregue al final del archivo: ignora cualquier seekmovimiento.
Por cierto. comportamiento interesante al menos en mi win7 / python2.7, para el nuevo archivo abierto en a+modo:
write('aa'); seek(0, 0); read(1); write('b')- el segundo writese ignora
write('aa'); seek(0, 0); read(2); write('b')- el segundo writesubeIOError

trabajador industrial3595112
fuente
10
¿Por qué no hay "Crear archivo si no existe. Si existe, colocar al inicio, habilitar lectura y escritura"? Este es el caso de uso más obvio para mí: estoy almacenando datos en un archivo. Si el archivo no está allí, créelo en lugar de generar errores. Si hay datos en el archivo, quiero leerlo todo desde la parte superior, actualice algunas cosas y luego vuelva a escribir completamente el archivo desde 0 la PRÓXIMA VEZ que lo cargue. Yo uso open(file,'a'); close(); open(file,'r+')para lograr esto.
cabeza de alfiler
2
¿Qué significa "truncar" en este contexto?
Charlie Parker
3
@CharlieParker Significa que todo el contenido del archivo se borra (el archivo se vacía)
industryworker3595112
1
Es posible que desee agregar una nota de que con ay las a+escrituras siempre sucederán al final del archivo, independientemente de si uno mueve manualmente el puntero usando seek().
balu
1
¿Qué pasa con la actualización de la tabla, para incluir 'x' para Python 3?
Nikos Alexandris
39

Las opciones son las mismas que para la función fopen en la biblioteca estándar de C:

w trunca el archivo, sobrescribiendo lo que ya estaba allí

a se agrega al archivo y se agrega a lo que ya estaba allí

w+ se abre para leer y escribir, truncando el archivo pero también permitiéndole leer lo que se ha escrito en el archivo

a+ se abre para agregar y leer, lo que le permite a ambos agregar al archivo y también leer su contenido

Eli Courtwright
fuente
2
¿Qué significa "truncar" en este contexto? ¿Significa eliminar los datos antiguos si tenían algunos? ¿O algo más específico?
Charlie Parker
3
@CharlieParker: Correcto, significa que todos los datos en el archivo existente se eliminarán y comenzaremos a escribir desde el comienzo de un archivo ahora vacío.
Eli Courtwright
9

Creo que es importante tenerlo en cuenta para la ejecución multiplataforma, es decir, como un CYA. :)

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'. Python en Windows distingue entre archivos de texto y binarios; Los caracteres de fin de línea en los archivos de texto se alteran automáticamente ligeramente cuando se leen o escriben los datos. Esta modificación detrás de escena de los datos de archivos está bien para los archivos de texto ASCII, pero corromperá datos binarios como ese en archivos JPEG o EXE. Tenga mucho cuidado de usar el modo binario al leer y escribir dichos archivos. En Unix, no está de más agregar una 'b' al modo, por lo que puede usarlo independientemente de la plataforma para todos los archivos binarios.

Esto está directamente citó de Python Software Foundation 2.7.x .

Goran B.
fuente
9

Me di cuenta de esto tratando de descubrir por qué usarías el modo 'w +' versus 'w'. Al final, acabo de hacer algunas pruebas. No veo mucho propósito para el modo 'w +', ya que en ambos casos, el archivo se trunca para empezar. Sin embargo, con la 'w +', puede leer después de escribir buscando de nuevo. Si intentaste leer con 'w', generaría un error IOE. Leer sin usar el modo de búsqueda con 'w +' no va a producir nada, ya que el puntero del archivo aparecerá después de donde ha escrito.

Wyrmwood
fuente