write with open not into how example creating create and python

with - save into file python



Función incorporada de python open: ¿diferencia entre los modos a, a+, w, w+y r+? (6)

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

En Windows, ''b'' añadido 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 de forma automática cuando se leen o escriben los datos. Esta modificación detrás de escena de los datos del archivo está bien para los archivos de texto ASCII, pero dañará los datos binarios como los archivos JPEG o EXE. Tenga mucho cuidado de usar el modo binario cuando lea y escriba tales archivos. En Unix, no se pierde nada con agregar una ''b'' al modo, de modo que puede usarla de forma independiente para todos los archivos binarios.

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

En la función de open incorporada de python, ¿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 qué significan estos términos.


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 mala interpretación)

  • leer - se permite la lectura 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 deja vacío (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: a y a+ siempre se agregan al final del archivo: ignora los movimientos de seek .
Por cierto comportamiento interesante al menos en mi win7 / python2.7, para el nuevo archivo abierto en modo a+ :
write(''aa''); seek(0, 0); read(1); write(''b'') write(''aa''); seek(0, 0); read(1); write(''b'') - la segunda write se ignora
write(''aa''); seek(0, 0); read(2); write(''b'') write(''aa''); seek(0, 0); read(2); write(''b'') - segunda write plantea IOError


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 adjunto al archivo, agregando a lo que ya estaba allí

w+ abre para leer y escribir, trunca el archivo pero también le permite leer lo que se ha escrito en el archivo

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


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

La página de fopen BSD fopen 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.


Me topé con esto tratando de averiguar por qué usaría el modo ''w +'' en lugar de ''w''. Al final, acabo de hacer algunas pruebas. No veo mucho propósito para el modo ''w +'', ya que en ambos casos, para empezar, el archivo está truncado. Sin embargo, con el ''w +'', puede leer después de escribir buscando de nuevo. Si intentara alguna lectura con ''w'', lanzaría un error IOError. La lectura sin utilizar la función de búsqueda con el modo ''w +'' no va a producir nada, ya que el puntero del archivo estará después de donde escribió.


Noté que de vez en cuando necesito que Google se vuelva a abrir, solo para crear una imagen mental de cuáles son las principales diferencias entre los modos. Entonces, pensé que un diagrama será más rápido para leer la próxima vez. Tal vez alguien más lo encontrará útil también.