Escribir en un archivo con la función print() de Python

La función de impresión de Python se usa normalmente para mostrar texto en la consola. También podemos usar la función de impresión para escribir en un archivo. Este artículo le muestra cómo.

Introducción

La función print() de Python se utiliza normalmente para mostrar texto en la línea de comandos o en el intérprete interactivo, dependiendo de cómo se ejecute el programa de Python. Sin embargo, podemos cambiar su comportamiento para escribir texto en un archivo en lugar de en la consola.

En este artículo, examinaremos las muchas formas en que podemos escribir en un archivo con la función print().

Redirigir la salida de un script de Python en la terminal {#redireccionar la salida de un script de Python en la terminal}

La forma rápida y sucia de redirigir la salida de un script de Python es directamente desde la línea de comandos mientras se ejecuta el script.

Por ejemplo, si tuviéramos un archivo de Python llamado hello.py con los siguientes contenidos:

1
print("Hallo") # Deliberately in German

Podemos redirigir la salida del archivo en el shell usando un solo corchete de ángulo recto:

1
$ python3 hello.py > output.txt

Si abrimos nuestro output.txt recién creado, veremos los siguientes contenidos:

1
Hallo

Sin embargo, con este método, toda la salida del script se escribe en un archivo. A menudo, es más flexible realizar esta redirección desde el propio script de Python.

Redirección del flujo de salida estándar

En Python, la función print() es más flexible de lo que piensas. No estaba codificado de tal manera que el texto especificado solo se puede escribir en la pantalla. En su lugar, envía texto a una ubicación llamada flujo de salida estándar, también conocido como stdout.

Todos los sistemas UNIX tienen tres tuberías principales: tubería de entrada estándar (stdin), tubería de salida estándar (stdout) y tubería de error estándar (stderr).

De forma predeterminada, la tubería de salida estándar apunta a la ventana interactiva utilizada para ejecutar el programa, por lo que normalmente vemos el texto impreso en la pantalla. Sin embargo, la salida estándar se puede redirigir a otras ubicaciones, como archivos, para mayor comodidad.

Si la salida estándar se redirige a un archivo específico, el texto especificado en la función imprimir() se escribirá en ese archivo en lugar de mostrarse en la pantalla.

En Python, se puede obtener una referencia a la salida estándar usando el objeto stdout del módulo sys. Es un objeto similar a un archivo, lo que significa que tiene métodos que permiten a Python leer y escribir desde él como un archivo real.

Veamos un ejemplo donde cambiamos stdout para que sea un archivo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import sys

print('This message will be displayed on the screen.')

original_stdout = sys.stdout # Save a reference to the original standard output

with open('filename.txt', 'w') as f:
    sys.stdout = f # Change the standard output to the file we created.
    print('This message will be written to a file.')
    sys.stdout = original_stdout # Reset the standard output to its original value

La función print() toma el argumento de cadena proporcionado, agrega un carácter de nueva línea al final y llama al método stdout.write() para escribirlo en la salida estándar.

En el ejemplo anterior, primero imprimimos una línea de texto como estamos acostumbrados, que se mostrará en la consola cuando ejecutemos el archivo. Luego reasignamos stdout a nuestro objeto de archivo personalizado - f. Dado que un objeto de archivo tiene un método write() perfectamente válido, nuestro valor impreso se escribe en el archivo sin ningún problema.

Tenga en cuenta que es una buena práctica almacenar el valor original de la salida estándar en una variable antes de cambiarla. De esta manera, podemos restablecer la salida estándar a su valor original una vez que hayamos terminado, lo que puede ayudar a evitar confusiones.

Guardemos el código en un nuevo archivo, printToFile.py. Y luego, vamos a ejecutarlo:

1
$ python3 printToFile.py

Veremos el siguiente resultado en la Terminal:

1
This message will be displayed on the screen.

Y el script creará un nuevo archivo llamado filename.txt con los siguientes contenidos:

1
This message will be written to a file.

Ha redirigido correctamente los datos del flujo de salida estándar a un archivo. Veamos cómo podemos hacer esto con otro objeto similar a un archivo popular que está dedicado a los errores de programación.

Redirigir el flujo de error estándar

En Python, los errores se escriben en el flujo de errores estándar, también conocido como stderr. Esto también está predeterminado en la ventana interactiva, pero se puede cambiar a través del objeto sys.stderr. Si quisiéramos imprimir valores en stderr, podríamos simplemente redirigir sys.stdout para apuntar a sys.stderr.

Cree un archivo llamado printToStderr.py y agregue el siguiente código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import sys

print('This message will be displayed via standard output.')

original_stdout = sys.stdout # Save a reference to the original standard output

sys.stdout = sys.stderr # Redirect the standard output to the standard error.
print('This message will be displayed via the standard error.')

sys.stdout = original_stdout # Reset the standard output to its original value

Este ejemplo es casi idéntico al anterior, excepto que en lugar de redirigir el flujo de salida estándar a un archivo, lo redireccionamos al flujo de error estándar. Si el flujo de error estándar también se redirigió a otro lugar, la salida se enviaría a esa ubicación en lugar de a la pantalla.

Vamos a ejecutar este archivo:

1
$ python3 printToStderr.py

Nuestra salida mostraría:

1
2
This message will be displayed via standard output.
This message will be displayed via the standard error.

Si bien puede parecernos una salida normal, para la computadora se muestra a través de diferentes canalizaciones.

Imprimir usando el parámetro "file"

En los ejemplos anteriores, redirigimos explícitamente la salida estándar a otro objeto similar a un archivo cambiando el objeto stdout. Sin embargo, por conveniencia, podemos hacer esto directamente desde dentro de la función print() especificando la ubicación de salida con el parámetro file:

Por ejemplo, si quisiéramos imprimir directamente en un archivo sin cambiar la stdout de todo el script, escribiríamos:

1
2
3
4
5
6
import sys

print('This message will be displayed on the screen.')

with open('filename.txt', 'w') as f:
    print('This message will be written to a file.', file=f)

Como no jugamos con la redirección explícita de la salida estándar, ya no tenemos que restablecerla a su valor inicial. Como resultado, esta es la forma preferida de escribir en un archivo con la función imprimir().

Nota: Aunque el nombre del parámetro es archivo, recuerda que funciona con cualquier objeto similar a un archivo. Si quisiera imprimir en stderr, por ejemplo, cambiaría la instrucción print() a:

1
print('This message will be written to stderr.', file=sys.stderr)

Conclusión

En este artículo, discutimos cómo redirigir la salida de la función print() de Python usando varios métodos. Estos métodos incluían la redirección de la salida de un script de Python desde la línea de comandos, la redirección de la salida estándar dentro de los scripts de Python y la especificación de un objeto similar a un archivo en el parámetro file directamente en la función print().

Sobre el autor

Este artículo fue escrito por Jacob Stopak, un desarrollador de software y consultor apasionado por ayudar a otros a mejorar sus vidas a través del código. Jacob es el autor de la Guía básica de codificación para desarrolladores, un libro introductorio que cubre conceptos y herramientas de codificación esenciales. Contiene capítulos sobre arquitectura informática básica, Internet, línea de comandos, HTML, CSS, JavaScript, Python, Java, bases de datos/SQL, Git y más.

Licensed under CC BY-NC-SA 4.0