HOWTO · Python

Comprobar si el archivo está vacío en Python

Aprenderemos a comprobar si los archivos están vacíos o no. También echamos un vistazo a diferentes problemas que surgieron al verificar un archivo vacío en Python.

En esta página

Un archivo de cero bytes no contiene ningún byte, pero «vacío» puede significar algo distinto en los datos estructurados: un CSV puede interpretarse sin filas, y un libro de Excel puede contener formato o metadatos de hojas aunque una hoja no tenga registros. Elige la comprobación que corresponda a lo que necesitas saber. Comprobar el tamaño permite saber si un archivo regular contiene bytes; comprobar una tabla permite saber si la tabla interpretada tiene filas.

Comprobar si un archivo está vacío según su tamaño

El sistema de archivos informa del tamaño en bytes. En un archivo regular, un tamaño de 0 significa que no contiene bytes. Un tamaño distinto de cero no demuestra que un archivo de texto contenga información útil: podría contener solo espacios en blanco, una marca de orden de bytes u otros datos que la aplicación no utiliza. Si te refieres a que no haya ningún carácter que no sea espacio en blanco, lee el contenido decodificado y comprueba esa condición.

Este ejemplo crea sus propios datos de entrada en una carpeta temporal y los elimina cuando termina el bloque. Solo utiliza la biblioteca estándar de Python, así que puedes pegarlo en un script sin preparar otro archivo de datos ni cambiar una ruta específica de un equipo. Las comprobaciones devuelven valores booleanos que el programa puede usar en una condición o pasar a una función de registro. Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    path.write_text("Ready to process.\n", encoding="utf-8")
    print(path.is_file())
    print(path.stat().st_size == 0)

El directorio temporal hace que el ejemplo no dependa de las carpetas de un equipo concreto. La primera comprobación verifica que la ruta corresponde a un archivo regular; la segunda comprueba si su tamaño en bytes es cero.

Usar pathlib para comprobar un archivo

Usa Path.is_file() antes de consultar el tamaño del archivo. Devuelve False si la ruta no existe o no corresponde a un archivo regular. En una aplicación real, sustituye path por la ruta que recibas como entrada; para las rutas de Windows, usa una cadena sin procesar si, de lo contrario, las barras inversas se interpretarían como secuencias de escape.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

from pathlib import Path

path = Path("notes.txt")
if not path.is_file():
    print("The path is missing or is not a regular file.")
else:
    try:
        empty = path.stat().st_size == 0
    except OSError as error:
        print(f"Could not check the file: {error}")
    else:
        print(f"Empty: {empty}")

La consulta del tamaño está dentro de try porque el archivo podría desaparecer o dejar de ser accesible después de que is_file() devuelva True. Si stat() falla, el ejemplo informa de ese error del sistema de archivos en lugar de tratar el archivo como vacío. Para una comprobación puntual, Path.stat().st_size == 0 es la prueba directa del tamaño; os.path.getsize(path) == 0 es una alternativa equivalente que acepta objetos de ruta.

Comprobar si un archivo CSV tiene filas

Los archivos CSV son texto que se interpreta, por lo que el número de bytes no permite contar los registros de forma fiable. Un archivo con encabezado y sin filas de datos contiene bytes, pero ningún registro. A la inversa, un CSV que solo contiene líneas en blanco puede no producir una tabla utilizable. Con pandas, DataFrame.empty es verdadero si alguno de los dos ejes tiene longitud cero; no significa que todas las celdas estén en blanco. Instala pandas para usar este método.

El siguiente ejemplo autónomo crea un CSV pequeño antes de interpretarlo. pandas.read_csv() puede generar pandas.errors.EmptyDataError cuando no hay columnas que interpretar. Gestiona esta condición específica por separado de un archivo inexistente, un problema de permisos o un CSV mal formado, ya que cada caso requiere una respuesta diferente.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

from pathlib import Path
from tempfile import TemporaryDirectory

try:
    import pandas as pd
except ImportError:
    print("Install pandas to run this example.")
else:
    with TemporaryDirectory() as folder:
        path = Path(folder) / "records.csv"
        path.write_text("name\nAda\n", encoding="utf-8")
        try:
            table = pd.read_csv(path)
        except pd.errors.EmptyDataError:
            print("The CSV has no parseable columns.")
        else:
            print(table.empty)

Comprobar si una hoja de Excel tiene filas

Un archivo .xlsx contiene la estructura del libro además de los valores de las celdas, así que su tamaño en bytes no permite saber si una hoja concreta tiene registros. Lee la hoja y comprueba el DataFrame resultante. De forma predeterminada, read_excel() usa la primera hoja; pasa sheet_name si los datos están en otra. Para leer archivos de Excel se necesita pandas y un motor de Excel compatible, como openpyxl para muchos archivos .xlsx.

Adapta la ruta y el nombre de la hoja al libro que recibas. DataFrame.empty comprueba si hay filas o columnas; una fila que contiene celdas en blanco sigue contando como fila. Si el libro no tiene filas utilizables, pero sí encabezados, la tabla puede tener columnas y cero filas; este es el caso habitual que pretende detectar esta comprobación. La comprobación de existencia siguiente muestra un mensaje claro si el libro ya no está. El archivo también podría desaparecer antes de que read_excel() lo abra, por eso esa lectura gestiona FileNotFoundError por separado.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

from pathlib import Path

try:
    import pandas as pd
except ImportError:
    print("Install pandas and an Excel engine to read a workbook.")
else:
    workbook = Path("data.xlsx")
    if not workbook.is_file():
        print("Provide the path to an existing workbook.")
    else:
        try:
            table = pd.read_excel(workbook, sheet_name="Sheet1")
        except FileNotFoundError:
            print("The workbook disappeared before it could be read.")
        except PermissionError:
            print("Permission denied while reading the workbook.")
        except (ImportError, ValueError) as error:
            print(f"Could not read the selected sheet or Excel engine: {error}")
        else:
            print(table.empty)

Gestionar archivos inexistentes y errores de lectura

No uses una cláusula general except: para clasificar como vacío cualquier archivo cuya lectura falle. Una ruta inexistente, el acceso denegado, una entrada mal formada y un archivo válido sin filas son resultados distintos. Para archivos regulares, comprueba is_file() y captura OSError alrededor de stat() si la ruta puede cambiar o el proceso podría carecer de acceso. Con pandas, captura EmptyDataError al gestionar un CSV sin columnas interpretables y, después, gestiona FileNotFoundError, PermissionError y los errores del analizador o del motor según las necesidades de la aplicación. Durante el desarrollo, deja visibles los errores inesperados en lugar de tratarlos silenciosamente como datos vacíos.

La distinción clave es qué estás midiendo: usa el sistema de archivos para comprobar los bytes e interpreta los datos CSV o Excel cuando quieras saber si una tabla o una hoja tiene filas. Ni un tamaño distinto de cero ni una fila con todas las celdas en blanco demuestran que existan registros útiles; define qué significa «utilizable» según la aplicación que procesa el archivo.