scanf, sscanf y fscanf en Python



Versión: 2.x, 3.x.

Aquéllos familiarizados con el lenguaje C, incluyéndome, habrán preguntado en alguna ocasión por estas funciones durante su aventura en Python. Al igual que yo, probablemente, hayan llegado a la conclusión que el lenguaje no incluye por defecto ninguna de estas reliquias arcaicas pues se las arregla bastante bien cuando se trata de lectura, escritura o bien análisis de cadenas, vía la gran cantidad de prestaciones estándar como las expresiones regulares.

Sin embargo, para los insistentes existe un pequeño módulo escrito íntegramente en Python que implementa dichas funciones y se distribuye bajo los términos de la licencia BSD. Se llama simplemente scanf y puedes encontrarlo en este enlace.

La última actualización del módulo data del 2008, por lo que lógicamente el soporte original se limita a Python 2.x. Puedes descargar mi adaptación del módulo para Python 3.x desde este enlace, que añade soporte para el tipo bytes.

Ejemplos

Tomando un clásico ejemplo de la función sscanf en C:

#include <stdio.h>

int main(int argc, char *argv[])
{
    const char *str = "Nombre: Juan - Edad: 31 - Altura: 1.81";
    char name[10];
    int age;
    float height;

    sscanf(str, "Nombre: %s - Edad: %d - Altura: %f", name, &age, &height);
    printf("%s %d %.02f\n", name, age, height);

    return 0;
}

Salida:

Juan 31 1.81

El código análogo en Python:

import scanf

print(scanf.sscanf("Nombre: Juan - Edad: 31 - Altura: 1.81",
                   "Nombre: %s - Edad: %d - Altura: %f"))

Retorna los valores como una tupla:

('Juan', 31, 1.81)

scanf opera de forma similar leyendo los datos desde la entrada estándar (stdin).

print(scanf.scanf("%s %d"))

[Entrada] Juan 31
[Salida] ('Juan', 31)

Por último, fscanf toma como primer argumento un fichero abierto previamente.

with open("input.txt", "rb") as f:
    print(scanf.fscanf(f, "Nombre: %s - Edad: %d - Altura: %f"))

Considerando el siguiente archivo input.txt:

Nombre: Juan - Edad: 31 - Altura: 1.81

En Python 3.x, las funciones sscanf y fscanf incluyen el parámetro opcional encoding para especificar la codificación de caracteres (por defecto "utf-8") al operar con el tipo bytes.

print(scanf.sscanf(b"Nombre: Juan - Edad: 31 - Altura: 1.81",
                   b"Nombre: %s - Edad: %d - Altura: %f",
                   encoding="utf-8"))

Los valores no numéricos son retornados como cadenas utilizando la codificación especificada.



2 comentarios.

Deja un comentario