HOWTO · Python

Python encuentra la cadena en el archivo

El tutorial demuestra cómo buscar una cadena en un archivo de texto en Python.

En esta página

Para encontrar una subcadena literal en un archivo de texto, usa read() con in para obtener una respuesta booleana, readlines() si necesitas revisar las líneas coincidentes o find() si necesitas la posición de un carácter. Para archivos grandes o datos orientados a bytes, mmap permite buscar directamente sobre un archivo mapeado. Los ejemplos usan el mismo texto breve para que puedas comparar los resultados y las ventajas de cada método. Todos se pueden ejecutar; las salidas mostradas coinciden con la ejecución suministrada.

Buscar en el contenido de un archivo con read() e in

El método read() devuelve el contenido restante del archivo como una sola cadena. Usa el operador in de Python para comprobar si esa cadena contiene el texto literal que buscas. La expresión produce True o False, lo cual resulta útil cuando solo necesitas saber si aparece la subcadena.

Es un método directo, pero lee el archivo completo en memoria antes de buscar. Es adecuado para archivos de texto pequeños o medianos, así como para los casos en que también necesitas todo su contenido. Si el archivo es demasiado grande para mantenerlo cómodamente en memoria, elige un método por líneas o un archivo mapeado.

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 directory:
    path = Path(directory) / "notes.txt"
    path.write_text("status=ready\nowner=Sam\n", encoding="utf-8")
    with path.open(encoding="utf-8") as file:
        found = "ready" in file.read()
    print(found)
True

Buscar línea por línea con readlines()

El método readlines() devuelve una lista con las líneas del archivo, incluidos los caracteres de salto de línea cuando están presentes. Puedes comprobar cada línea con in y detenerte al encontrar la primera coincidencia. Esto resulta útil cuando necesitas la propia línea, por ejemplo, para decidir qué registro mostrar o procesar.

Aunque el bucle pueda detenerse pronto, readlines() ya habrá cargado todas las líneas en una lista. Por tanto, el uso de memoria aumenta con el tamaño del archivo. Si quieres procesar un archivo grande de forma incremental, recórrelo directamente mientras está abierto con for line in file; así evitarás crear la lista completa y conservarás la misma lógica de búsqueda línea por línea.

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 directory:
    path = Path(directory) / "notes.txt"
    path.write_text("status=ready\nowner=Sam\n", encoding="utf-8")
    with path.open(encoding="utf-8") as file:
        for line in file.readlines():
            if "owner" in line:
                print(line.rstrip())
                break
owner=Sam

Usar find() para obtener la posición de una coincidencia

Usa el método find() de una cadena sobre el contenido que devuelve read() cuando necesitas el índice del carácter inicial, en lugar de una respuesta de sí o no. El índice empieza en cero: si la coincidencia está al principio, devuelve 0; si aparece más adelante, devuelve su posición en la cadena. Si no hay coincidencia, find() devuelve -1. Comprueba explícitamente ese valor en vez de tratar cualquier resultado como un booleano, porque en Python 0 se interpreta como falso.

La posición devuelta cuenta caracteres de la cadena Python decodificada, no bytes del archivo. Si el archivo contiene texto no ASCII, ábrelo con una codificación adecuada. Si necesitas desplazamientos en bytes o el contenido es binario, usa una búsqueda orientada a bytes, como mmap con un patrón de bytes.

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 directory:
    path = Path(directory) / "notes.txt"
    path.write_text("status=ready\nowner=Sam\n", encoding="utf-8")
    with path.open(encoding="utf-8") as file:
        contents = file.read()
    position = contents.find("ready")
    print(position)
    print(contents.find("missing"))
7
-1

Buscar en un archivo grande con mmap

El módulo mmap mapea un archivo a un objeto similar a bytes que permite buscar sin crear primero una cadena Python con todo el archivo. Puede ser útil para trabajar con archivos grandes, pero no garantiza que la búsqueda sea más rápida: el rendimiento depende del archivo, el almacenamiento, el sistema operativo y el patrón de acceso. El mapeo también consume recursos del sistema operativo, así que ciérralo cuando termines.

Busca en el mapeo con un patrón de bytes, como b"ready". A diferencia de los ejemplos de texto, esta búsqueda examina bytes codificados y devuelve un desplazamiento en bytes. El patrón debe ser de tipo bytes; una cadena normal como "ready" es de otro tipo. Este ejemplo usa bytes UTF-8 para el mismo texto ASCII y abre el archivo en modo binario.

Ejecuta este ejemplo:

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

import mmap
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    path = Path(directory) / "notes.txt"
    path.write_bytes(b"status=ready\nowner=Sam\n")
    with path.open("rb") as file:
        with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mapped:
            print(mapped.find(b"ready"))
7

Elegir el método adecuado

Elige read() con in cuando baste con una respuesta booleana y el texto completo quepa cómodamente en memoria. Elige readlines() cuando necesites una lista de líneas para revisarlas o conservarlas; recuerda que la lista contiene todo el archivo. Para archivos de texto grandes cuyas líneas puedan procesarse por separado, recorre directamente el objeto de archivo en vez de almacenar todas las líneas.

Elige find() cuando te importe la posición del primer carácter de la coincidencia literal. Comprueba si el resultado es -1 para detectar que no aparece y considera 0 una posición válida. Elige mmap cuando convenga buscar bytes directamente en el archivo y te sirva obtener un desplazamiento en bytes; codifica el objetivo como bytes y no des por hecho que el mapeo siempre será más rápido. Estos métodos buscan texto literal. Si necesitas patrones, normalizar mayúsculas y minúsculas o encontrar todas las apariciones, elige un método pensado para ese requisito.