"""Lee un archivo de texto intentando multiples encodings en orden.""" from __future__ import annotations def read_file_with_encoding( path: str, encodings: list[str] | None = None, ) -> str: """Lee un archivo de texto intentando multiples encodings en orden. Intenta abrir el archivo con cada encoding de la lista hasta que uno tenga exito. Util para archivos de origen desconocido (Windows, Latin-1, archivos con BOM, etc.). Args: path: Ruta al archivo a leer. encodings: Lista de encodings a intentar en orden. Por defecto ["utf-8", "utf-8-sig", "latin-1", "cp1252"]. Returns: Contenido del archivo como string. Raises: ValueError: Si ningun encoding logra decodificar el archivo. FileNotFoundError: Si el archivo no existe. OSError: Si hay un error de I/O al abrir el archivo. """ if encodings is None: encodings = ["utf-8", "utf-8-sig", "latin-1", "cp1252"] last_error: UnicodeDecodeError | None = None for encoding in encodings: try: with open(path, encoding=encoding) as fh: return fh.read() except UnicodeDecodeError as exc: last_error = exc continue raise ValueError( f"Unable to decode file '{path}' with encodings {encodings}. " f"Last error: {last_error}" )