Escribir archivos usando Python

    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

    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.stdiny 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

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *