Como se se帽al贸 en un art铆culo anterior que trata sobre la lectura de datos de archivos, el manejo de archivos pertenece al conocimiento esencial de todo programador profesional de Python. Esta funci贸n es una parte fundamental del lenguaje Python y no es necesario cargar ning煤n m贸dulo adicional para hacerlo correctamente.
Conceptos b谩sicos de escritura de archivos en Python
Contenido
Los m茅todos habituales para operar con archivos son open()
para abrir un archivo, seek()
para establecer la posici贸n actual del archivo en el desplazamiento dado, y close()
para cerrar el archivo despu茅s. los open()
El m茅todo devuelve un identificador de archivo que representa un objeto de archivo que se utilizar谩 para acceder al archivo para leerlo, escribirlo o adjuntarlo.
Escribir en un archivo requiere algunas decisiones: el nombre del archivo en el que se almacenan los datos y el modo de acceso del archivo. Hay dos modos disponibles, escribir en un archivo nuevo (y sobrescribir cualquier dato existente) y agregar datos al final de un archivo que ya existe. Las abreviaturas correspondientes son “w” y “a”, y deben especificarse antes de abrir un archivo.
En este art铆culo, explicaremos c贸mo escribir datos en un archivo l铆nea por l铆nea, como una lista de l铆neas, y c贸mo agregar datos al final de un archivo.
Escribir una sola l铆nea en un archivo
Este primer ejemplo es bastante similar a escribir en archivos con los populares lenguajes de programaci贸n C y C ++, como ver谩 en el Listado 1. El proceso es bastante sencillo. Primero, abrimos el archivo usando el open()
m茅todo de escritura, escriba una sola l铆nea de texto en el archivo utilizando el write()
y luego cierre el archivo con el close()
m茅todo. Tenga en cuenta que debido a la forma en que abrimos el archivo “helloworld.txt”, se crear谩 si a煤n no existe, o se sobrescribir谩 por completo.
filehandle = open('helloworld.txt', 'w')
filehandle.write('Hello, world!n')
filehandle.close()
Listado 1
Todo este proceso se puede acortar utilizando el with
declaraci贸n. El Listado 2 muestra c贸mo escribir eso. Como ya se dijo antes, tenga en cuenta que al abrir el archivo “helloworld.txt” de esta manera se crear谩 si a煤n no existe o se sobrescribir谩 por completo, de lo contrario.
with open('helloworld.txt', 'w') as filehandle:
filehandle.write('Hello, world!n')
Listado 2
Escribir una lista de l铆neas en un archivo
En realidad, un archivo no consta solo de una l铆nea, sino de muchos m谩s datos. Por lo tanto, el contenido del archivo se almacena en una lista que representa un b煤fer de archivo. Para escribir el b煤fer de archivo completo usaremos el writelines()
m茅todo. El Listado 3 le da un ejemplo de esto.
filehandle = open("helloworld.txt", "w")
filebuffer = ["a first line of text", "a second line of text", "a third line"]
filehandle.writelines(filebuffer)
filehandle.close()
Listado 3
Ejecutando el programa Python que se muestra en el Listado 3 y luego usando el cat
comando podemos ver que el archivo “helloworld.txt” tiene el siguiente contenido:
$ cat helloworld.txt
a first line of texta second line of texta third line
Listado 4
Esto sucede porque el writelines()
El m茅todo no agrega autom谩ticamente ning煤n separador de l铆nea al escribir los datos. El Listado 5 muestra c贸mo lograr eso, escribiendo cada l铆nea de texto en una sola l铆nea agregando el separador de l铆nea ” n”. Usando una expresi贸n generadora, cada l铆nea se sustituye por la l铆nea m谩s el separador de l铆nea. Nuevamente, puede formular esto usando el with
declaraci贸n.
with open('helloworld.txt', 'w') as filehandle:
filebuffer = ["a line of text", "another line of text", "a third line"]
filehandle.writelines("%sn" % line for line in filebuffer)
Listado 5
Ahora, el archivo de salida “helloworld.txt” tiene el contenido deseado como se muestra en el Listado 6:
$ cat helloworld.txt
a first line of text
a second line of text
a third line
Listado 6
Curiosamente, hay una forma de utilizar la redirecci贸n de salida en Python para escribir datos en archivos. El Listado 7 muestra c贸mo codificar eso para Python 2.x.
# define the name of the output file
filename = "helloworld.txt"
# define content
filecontent = ["Hello, world", "a second line", "and a third line"]
with open(filename, 'w') as filehandle:
# redirect the output of print to the file handle
for line in filecontent:
print >>filehandle, line
Listado 7
Para las 煤ltimas versiones de Python, esto ya no funciona de la misma manera. Para hacer algo como esto debemos usar el sys
m贸dulo. Nos permite acceder a los canales de salida est谩ndar de UNIX a trav茅s de sys.stdout
, sys.stdin
y sys.stderr
. En nuestro caso conservamos el valor original del canal de salida sys.stdout
, primero (l铆nea 8 en el c贸digo a continuaci贸n), redef铆nalo en el identificador de nuestro archivo de salida, luego (l铆nea 15), imprime los datos como de costumbre (l铆nea 18) y finalmente restaura el valor original del canal de salida sys.stdout
(l铆nea 21). El Listado 8 contiene el c贸digo de ejemplo.
# import sys module
import sys
# define the name of the output file
filename = "helloworld.txt"
# preserve the stdout channel
original = sys.stdout
# define content
filecontent = ["Hello, world", "a second line", "and a third line"]
with open(filename, 'w') as filehandle:
# set the new output channel
sys.stdout = filehandle
for line in filecontent:
print(line)
# restore the old output channel
sys.stdout = original
Listado 8
Esta no es necesariamente la mejor pr谩ctica, pero le brinda otras opciones para escribir l铆neas en un archivo.
Agregar datos a un archivo
Hasta ahora, hemos almacenado datos en archivos nuevos o en datos sobrescritos en archivos existentes. Pero, 驴qu茅 pasa si queremos agregar datos al final de un archivo existente? En este caso, necesitar铆amos abrir el archivo existente usando un modo de acceso diferente. Cambiamos eso a ‘a’ en lugar de ‘w’. El Listado 9 muestra c贸mo manejar eso. Y el Listado 10 hace lo mismo, pero usa el with
declaraci贸n m谩s bien.
filehandle = open('helloworld.txt','a')
filehandle.write('n' + 'Hello, world!n')
filehandle.close()
Listado 9
with open('helloworld.txt', 'a') as filehandle:
filehandle.write('n' + 'Hello, world!n')
Listado 10
Usando el mismo archivo helloworld.txt de antes, ejecutar este c贸digo producir谩 el siguiente contenido del archivo:
$ cat helloworld.txt
Hello, world
a second line
and a third line
Hello, world!
Conclusi贸n
Escribir datos de texto sin formato en archivos o agregar datos a archivos existentes es tan f谩cil como leer archivos en Python. Tan pronto como se cierra un archivo despu茅s de escribir o agregar datos, Python activa una llamada de sincronizaci贸n. Como resultado, el archivo actualizado se escribe inmediatamente en el disco.
Referencias
- Frank Hofmann: lectura de archivos con Python
- Python 101: redirecci贸n de stdout