Escribir en archivos de texto TXT con Python

Escribir en archivos de texto TXT con Python

Llegamos a la segunda parte de este curso de manejo de archivos txt con Python. Puedes ver la primera parte aquí.


En esta ocasión, te voy a mostrar como escribir en los archivos txt con Python y como manejar ciertas tareas de codificación de caracteres, así como la detección del lenguaje de escritura del archivo.

Escribir en archivos txt con Python

Llegamos al siguiente modo, el de escritura. Con este modo, podremos realizar cambios en archivos txt y guardarlos.

Crear archivos txt desde Python

Cuando utilizamos el modo escritura ("w") con with open, si un archivo existe, reemplazamos todo su contenido y si no existe. Lo crea. Empecemos eliminando el archivo txt de pruebas. Vamos a crearlo de nuevo con with open().

with open("test.txt", "w") as archivo:
    archivo.write("Esta es una línea escrita en el archivo.")

Al hacer esto, si no has eliminado previamente el archivo llamado "test.txt", lo habrá sobreescrito con el string que le he pasado en el "archivo.write()".

problemas de codificación con Python

Aparece con problemas de codificación en los acentos, de nuevo.

Así, que vamos a solucionar el fallo que llevamos desde el principio.

Codificación para trabajar con acentos con archivos txt en Python

Una forma de solucionar los problemas de codificación con los archivos, es añadir al with open, el argumento "encoding" y darle un valor de "utf-8". Esto nos sirve para el modo lectura y escritura.

with open("test.txt", "r", encoding="utf-8") as archivo:
    print(archivo.read())

Sin embargo, al intentar leer el archivo en codificación utf-8, me da el siguiente error:

Error en la consola

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 13: invalid continuation byte

Este error es producido, porque antes, he creado el archivo con with open() "w", sin indicar codificación alguna, lo que ha hecho, que se cree con codificación "ISO-8859-1".

Ver codificación de los archivos

Cuando queremos saber qué tipo de codificación tiene un archivo de texto, podemos utilizar el módulo chardet.

Instalar chardet de Python

Para instalar chardet, solo tienes que ejecutar el siguiente comando en la terminal:

pip install chardet

Importar chardet

Para importar chardet solo tienes que hacer este import:

import chardet

Lo siguiente que haremos, será abrir el archivo en modo lectura de bytes "rb".


Leer archivos txt en modo lectura de bytes en Python

El modo lectura de bytes (read bytes), es un modo para leer el contenido de un archivo como secuencia de bytes, en lugar de leerlo en caracteres, como hacía el modo de lectura normal.

import chardet

with open('test.txt', 'rb') as archivo:
    resultado = chardet.detect(archivo.read())
    print(resultado['encoding'])

Resultado en la consola

ISO-8859-1

¿Cómo funciona chardet?

Lo primero, es abrir el archivo en modo lectura de bytes con el modo "rb".

Utilizamos el método detect() de chardet con el archivo abierto. Este método, se encarga de analizar el contenido y en base a los resultados, arroja una codificación.

Si imprimes la variable "resultado" sin ninguna clave, verás que devuelve un diccionario como este:

import chardet

with open('test.txt', 'rb') as archivo:
    resultado = chardet.detect(archivo.read())
    print(resultado)

Resultado en la consola

{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}

La parte de encoding, nos dice la codificación del archivo. La parte de confidencia, el nivel de confianza de la detección con un valor del 0 al 1, siendo 1 el 100% de confianza.

En este ejemplo, el algoritmo está un 73% seguro de que es esa codificación.

Este nivel de confianza, puede servirnos para que se tomen ciertas acciones en base a cierto nivel de confianza.

Después, la parte del lenguaje, está para detectar en que lenguaje está escrito el archivo. Sin embargo, chardet no lo hace de forma nativa, requiere de la combinación con otro módulo.

Instalar langdetect en Python

Para instalar langdetect en Python, solo tienes que poner el siguiente comando en la terminal:

pip install langdetect

Importar langdetect

Del módulo langdetect, solo vamos a importar su función "detect".

from langdetect import detect

Ahora, pon el siguiente código para detectar la codificación, la confiabilidad y añadir el valor devuelto por langdetect a la clave de diccionario 'language' de chardet.

import chardet
from langdetect import detect

with open('test.txt', 'rb') as archivo:
    contenido = archivo.read() # Se lee el archivo
    resultado = chardet.detect(contenido) # Se crea el diccionario de chardet.detect()
    lenguaje = detect(contenido.decode(resultado['encoding'])) #Utilizamos el método detect() de langdetect
    resultado['language'] = lenguaje # Se le añade el resultado al diccionario de chardet
    print(resultado) # Comprobamos el resultado

En el archivo txt, pongo lo siguiente:

Programación Fácil es un sitio web para aprender programación.

Resultado en la consola

{'encoding': 'utf-8', 'confidence': 0.87625, 'language': 'es'}

Establecer codificación en UTF-8 para los archivos TXT con Python

Si quieres que los archivos se creen directamente en codificación UTF-8, es tan sencillo como establecerlo en el with open al crearlo:

import chardet
from langdetect import detect

with open("test.txt", "w", encoding="utf-8") as archivo: #Creamos el archivo en codificación utf-8
    archivo.write("Programación Fácil es un sitio web para aprender programación.")

with open('test.txt', 'rb') as archivo:
    contenido = archivo.read() # Se lee el archivo
    resultado = chardet.detect(contenido) # Se crea el diccionario de chardet.detect()
    lenguaje = detect(contenido.decode(resultado['encoding'])) #Utilizamos el método detect() de langdetect
    resultado['language'] = lenguaje # Se le añade el resultado al diccionario de chardet
    print(resultado) # Comprobamos el resultado

Resultado en la consola

{'encoding': 'utf-8', 'confidence': 0.87625, 'language': 'es'}

Seguimos en el siguiente capítulo con más tareas para el manejo de archivos txt desde Python.

No te pierdas nada del curso Máster en Python.


Deja una respuesta

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

curso de Python Entrada anterior Leer archivos de texto TXT con Python
logo css Entrada siguiente Sintaxis de los estilos CSS