2009-09-23 14 views
350

En la función incorporada python open, ¿cuál es la diferencia exacta entre los modos w, a, w +, a + y r +?python open built-in function: diferencia entre los modos a, a +, w, w + y r +?

En particular, la documentación implica que todos estos permitirán escribir en el archivo, y dice que abre los archivos para "agregar", "escribir" y "actualizar" específicamente, pero no define cuáles son estos términos media.

+8

El enlace que proporcionó define exactamente los valores. ¿Qué parte del enlace que proporcionó no podría ver o comprender? ¿Podría aclarar su pregunta para explicar lo que no entendió sobre el enlace? –

+58

Tuve la _exact_ misma pregunta que el cartel original, que es lo que me trajo a esta página. Los documentos de Python dejan de lado la explicación crucial de que "abrir el archivo para actualizar" significa "abre el archivo tanto para leer como para escribir", lo que responde a mi pregunta. –

+3

Lo que dijo Chris B. He editado la pregunta para aclararla y hacerla "más real". –

Respuesta

451

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

The BSD fopen manpage 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. 
+2

Creo que te refieres a la llamada fopen en la biblioteca estándar de C (que no es una llamada al sistema) –

+1

En efecto, hay diferencias significativas entre los dos. Ej: 'a +' en sys call posiciona la secuencia al principio del archivo, en std lib se posiciona al final. Fixing link ... –

+1

excelente respuesta. ¡Gracias! – g33kz0r

35

Las opciones son las mismas que para el fopen function en la biblioteca estándar C:

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

a se agrega al archivo, agregando lo que ya estaba allí

w+ abre para la lectura y la escritura, truncando el archivo sino también que le permite leer de nuevo lo que se ha escrito en el fichero de

a+ abre para consignar y la lectura, lo que le permite tanto al final del archivo y también leer su contenido

+1

Tenía que venir aquí para obtener la diferencia entre w y w +. ¡Muchas gracias! –

+1

¿Qué significa "truncar" en este contexto? ¿Significa eliminar los datos antiguos si tuviera alguno? ¿O algo más específico? –

+2

@CharlieParker: Correcto: significa que se eliminarán todos los datos en el archivo existente y comenzaremos a escribir desde el comienzo de un archivo ahora vacío. –

7

Me he dado cuenta de esto tratando de descubrir por qué usarías el modo 'w +' contra 'w'. Al final, acabo de hacer algunas pruebas. No veo mucho propósito para el modo 'w +', ya que en ambos casos, el archivo está truncado para comenzar. Sin embargo, con la 'w +', podría leer después de escribir buscando nuevamente. Si intentaras leer con 'w', arrojaría un IOError. Leer sin usar buscar con el modo 'w +' no va a ceder nada, ya que el puntero del archivo estará después de donde haya escrito.

241

Me di cuenta de que de vez en cuando necesito volver a fopen de 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 también lo encuentre útil.

+1

Entonces '' 'básicamente significa escribir. Es extraño que la 'w' no signifique eso, pero significa truncar ... (después de leer la siguiente respuesta, parece que' w' escribe y 'a' significa agregar. Eso tiene más sentido ...) ¿Tiene algún comentario sobre la creación de archivos si no existe? –

+0

La creación de archivos ocurre para todos los métodos _except_ 'r' y' r + '(donde se supone que HAY un archivo para leer inicialmente ...). – tenfishsticks

+0

La descripción 'a' está ** mal **. Las escrituras siempre se colocan al final. –

110

misma información, simplemente 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: (sólo para evitar cualquier interpretación errónea)

  • lectura - leer el archivo está permitido
  • escribir - escribir en el archivo está permitido

  • Crear - archivo se crea si no existe todavía

  • trunctate - durante la apertura del fichero, se hace vacío (todo el contenido del archivo se borra)

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

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

Nota: a y a+ siempre se agregan al final del archivo: ignora cualquier movimiento seek.
BTW. comportamiento interesante, al menos en mi win7/python2.7, para el nuevo archivo se abrió en a+ modo:
write('aa'); seek(0, 0); read(1); write('b') - segundo write se ignora
write('aa'); seek(0, 0); read(2); write('b') - segundo write plantea IOError

+1

Muy claro y fácil de recordar. – lengxuehx

+3

¿Por qué no hay "Crear archivo si no existe. Si existe, posición al inicio, habilite 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 error. Si hay datos en el archivo, quiero leerlo todo desde la parte superior, actualizar algunas cosas y luego volver a escribir completamente el archivo desde 0 para la próxima vez que lo cargue. Yo uso 'abrir (archivo, 'a'); cerca(); abrir (archivo, 'r +') 'para lograr esto. – pinhead

+0

@pinhead Lo que está describiendo se maneja de forma más adecuada abriendo el archivo en modo de lectura, cargando el contenido en la memoria y cerrándolo, abriéndolo después en modo de escritura para que se escriba cuando haya terminado. Supongo que en el caso de uso que describe que desea que todo el archivo esté en la memoria, y de esta manera no corrompe el archivo en caso de que el programa finalice antes de que tenga tiempo de guardar y salir. – krs013

6

creo que esto es importante tener en cuenta para la cruzada ejecución de la plataforma, 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 hace una distinción entre archivos de texto y binarios; los caracteres de fin de línea en los archivos de texto se modifican automáticamente cuando se leen o escriben los datos. Esta modificación entre bastidores de los datos de archivos está bien para los archivos de texto ASCII, pero dañará los datos binarios de esa manera en los 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 puedes usarla independientemente de la plataforma para todos los archivos binarios.

Esto se cita directamente en Python Software Foundation 2.7.x.

Cuestiones relacionadas