Búsqueda rápida de archivos usando Python (cree un índice de búsqueda de archivos)

Método de búsqueda básico:

Búsqueda de archivos con la biblioteca pathlib Cuando busque archivos con Python, necesita usar la función glob() y la función rglob() de la biblioteca pathlib.La función glob() puede implementar el método de búsqueda basado en el nombre del archivo y el La función rglob puede implementar el método de búsqueda basado en extensiones.


from pathlib import Path

base_dir = '/Users/edz/Desktop/'
keywords = '**/*BBC*'

# 遍历base_dir指向的目录下所有的文件
p = Path(base_dir)

# 当前目录下包含BBC的所有文件名称
files = p.glob(keywords)  
# files的类型是迭代器
# 通过list()函数转换为列表输出
# print(list(files))

# xlsx结尾的文件
files2 = p.rglob('*.xlsx')
print(list(files2))

# 遍历子目录和所有文件
files3 = p.glob('**/*')
print(list(files3))

Dado que glob() coincide con la ruta y el nombre del archivo, como: "c:\somepath\to\filename_include_BBC_voice.exe", y generalmente usamos palabras clave cuando buscamos archivos, como "BBC", por lo que al buscar, necesitamos agregar una forma de comodín a la palabra clave, como "BBC".

Un comodín es un símbolo especial similar a los metacaracteres de expresiones regulares. No se puede usar en expresiones regulares, pero solo se puede usar en patrones de coincidencia glob (nombre completo global).
inserte la descripción de la imagen aquí
La función rglob realiza la coincidencia desde el final de la ruta del archivo hacia adelante, que es la principal diferencia entre ella y la función glob(). Según las características del orden de búsqueda de la función rglob(), a menudo se usa para buscar extensiones, como usar rglob ('*.xlsx') para buscar todos los archivos con la extensión xlsx, que es más simple que la coincidencia de patrones escrita con glob(), y el significado de los argumentos es más claro.

Finalmente, mirando los valores de retorno de las funciones glob() y rglob(), debo recordarles que el resultado de su ejecución es un nuevo tipo de datos que no hemos tocado en lecciones anteriores, este tipo se llama " iterador" ".

Dos formas de mejorar la eficiencia de búsqueda

La implementación de la búsqueda de archivos con la biblioteca pathlib de Python solo es más flexible que la búsqueda predeterminada de Windows, pero no aporta ninguna mejora en la eficiencia de la búsqueda. Para reducir el tiempo de espera de la búsqueda, a continuación, le enseñaré a usar los dos métodos de especificar la ruta de búsqueda y crear un archivo de índice para mejorar la eficiencia de búsqueda de la biblioteca pathlib.

especificar la ruta de búsqueda

Veamos el primero, especificando la ruta de búsqueda.
Necesitamos hacer esto en tres pasos:

Primero genere un archivo de configuración y escriba la ruta que se buscará en el archivo de configuración;

Luego escriba una función personalizada para leer el archivo de configuración y buscar, leer la ruta en el archivo de configuración y buscar directorio por directorio;

Finalmente, los resultados de la búsqueda de varios directorios se combinan y se generan para que pueda encontrar rápidamente los archivos que desea a través de los resultados.

Hablemos del primer paso, cómo usar Python para leer el archivo de configuración. En el pasado, escribíamos la ruta a buscar en una variable y poníamos el nombre de la variable que define la ruta en las primeras líneas del código, para que la variable se pueda encontrar cuando se modifique el directorio de búsqueda la próxima vez. Sin embargo, para un programa con una ingeniería de código ligeramente compleja, a menudo hay varios archivos de código, lo que aún no es propicio para modificar la ruta de búsqueda cada vez que se realiza una búsqueda. El nuevo enfoque es poner las variables en un archivo separado llamado archivo de configuración del código.

La ventaja de este enfoque es que no tiene que abrir el archivo de código cuando modifica el directorio de búsqueda. Suponga que su amigo también necesita funciones similares, entonces puede enviarle el código y el archivo de configuración juntos, incluso si no conoce Python en absoluto, puede usar el programa que escribió para lograr una búsqueda eficiente.

Los archivos de configuración son generalmente archivos de texto. El formato del archivo de configuración generalmente lo especifica el autor del software en función de las funciones del software y sus propios hábitos, pero también hay formatos de archivo de configuración generales.

Por ejemplo, en el sistema Windows, el archivo de configuración más común es el archivo con la extensión .ini En la lección de hoy, tomamos el formato de archivo .ini como el formato estándar del archivo de configuración. El formato de archivo .ini consta de tres secciones, secciones, parámetros y comentarios. El formato es el siguiente:

[section]
参数
(键=值)
  name=value
注释 
注释使用“;”分号表示。在分号后面的文字,直到该行结尾都全部为注解。
;注释内容
#基于.ini 文件的格式,我把配置搜索路径的配置文件修改为如下:
[work]
;工作文件保存路径
searchpath=/Users/edz,/tmp

[game]
;娱乐文件保存路径
searchpath=/games,/movies,/music

En este código, configuré dos "secciones" para trabajo y juego, que representan trabajo y juego respectivamente. La ventaja de esta configuración es que puedo buscar en diferentes directorios para diferentes propósitos. Si se utilizan menos directorios para las búsquedas, el tiempo de espera para las búsquedas se reduce en consecuencia.

Además, encontrará que los parámetros en las dos "secciones" se especifican con el mismo nombre --searchpath. La ventaja de esta configuración es que cuando cambio el ámbito de búsqueda de "trabajo" a "entretenimiento", solo necesito para modificarlo en el código La "sección" de la búsqueda, sin modificar los parámetros de búsqueda.

Además de "sección" y "parámetro", en el archivo de configuración, también debe prestar atención a la forma en que configuro el valor del parámetro ruta de búsqueda, su valor es el rango de ruta que quiero buscar, para que sea más conveniente para leer en el programa Rutas múltiples, uso comas para separar las rutas múltiples.

Después de encontrar la ruta completa del archivo search.ini, debe leer y analizar el formato de archivo .ini. Python tiene una biblioteca que implementa esta función, que se llama biblioteca configparser. Con esta biblioteca, puede leer directamente la ruta de búsqueda parámetro en el archivo .ini. , no es necesario leer el contenido del archivo a través de la función read () y escribir manualmente un script para analizar el archivo .ini.


import configparser
import pathlib 
from pathlib import Path

def read_dirs(ini_filename, section, arg):
    """
    通过ini文件名,节和参数取得要操作的多个目录
    """
    current_path = pathlib.PurePath(__file__).parent
    inifile = current_path.joinpath(ini_filename)

    # cf是类ConfigParser的实例
    cf = configparser.ConfigParser()

    # 读取.ini文件
    cf.read(inifile)

    # 读取work节 和 searchpath参数 
    return cf.get(section, arg).split(",")

def locate_file(base_dir, keywords):
    p = Path(base_dir)
    files = p.glob(keywords) 
    return list(files)


dirs = read_dirs('search.ini', 'work', 'searchpath')
# ['/Users/edz', '/tmp']
keywords = '**/*BBC*'

# 定义存放查找结果的列表
result = []

# 从每个文件夹中搜索文件
for dir in dirs:
    files = locate_file(dir, keywords)
    result += files

# 将PosixPath转为字符串
print( [str(r) for r in result] )

La función read_dirs() implementa la lectura de un archivo .ini y procesa las múltiples rutas devueltas como un tipo de lista. El tipo de lista es adecuado para varios conjuntos de datos en paralelo, y varios directorios pueden usar simplemente el tipo de datos de lista para almacenar el nombre del directorio que se buscará.

La función localizar_archivo() busca en cada directorio a través de la función de bucle en la línea 35 del código y almacena los resultados de la búsqueda en la variable de resultado. La variable de resultado es un tipo de datos de lista. Dado que el archivo buscado puede contener varias rutas de archivos coincidentes, necesito almacenar los resultados buscados en la lista de resultados, luego continuar buscando el siguiente directorio y continuar pasando el apéndice ( ) para Los resultados se colocan en la lista, y todo el programa de búsqueda no se ejecuta realmente hasta que se completan todas las búsquedas en el directorio.

Finalmente, debe prestar atención al hecho de que en el proceso de procesamiento de rutas, la biblioteca pathlib define uniformemente la ruta como un objeto PosixPath() para evitar la diferencia en el método de escritura de rutas de diferentes sistemas operativos. Por lo tanto, cuando usa estas rutas, primero debe convertir el objeto PosixPath en un tipo de cadena. En la última línea del código, utilizo la función incorporada de Python str() para convertir los objetos PosixPath a tipo de cadena uno por uno, y los almaceno nuevamente en la lista.

archivo de índice

Podemos hacer cambios basados ​​en el programa que especifica la ruta de búsqueda: primero, cambie el método de almacenamiento de todas las rutas de archivo en el directorio del archivo de configuración de una lista a un archivo; luego cambie la función de búsqueda para buscar desde un archivo.


def locate_file(base_dir, keywords='**/*'):
    """
    迭代目录下所有文件
    """
    p = Path(base_dir)
    return p.glob(keywords)

def write_to_db():
    """
    写入索引文件
    """
    current_path = pathlib.PurePath(__file__).parent
    dbfile = current_path.joinpath("search.db")

    with open(dbfile, 'w', encoding='utf-8') as f:
        for r in result:
            f.write(f"{
      
      str(r)}\n")

# 读取配置文件
dirs = read_dirs('search.ini', 'work', 'searchpath')

# 遍历目录
result = []
for dir in dirs:
    for files in locate_file(dir):
        result.append(files)

# 将目录写入索引文件
write_to_db()

En el código, agregué la función write_to_db(), que está en la línea 16-18 del código, y reemplacé la función de escribir en la lista escribiendo en un archivo. Al mismo tiempo, para recorrer todos los directorios, también modifiqué el segundo parámetro de la función localizar_archivo() y lo cambié a “keywords='/*'”. A través de estas dos modificaciones, todas las rutas de archivo se guardan en el archivo search.db. **

El contenido del archivo search.db es el siguiente, que registra todas las rutas de archivo en todos los directorios especificados por el archivo de configuración:


/tmp/com.apple.launchd.kZENgZTtVz
/tmp/com.google.Keystone
/tmp/mysql.sock
/tmp/com.adobe.AdobeIPCBroker.ctrl-edz
/tmp/com.apple.launchd.kZENgZTtVz/Listeners
/tmp/com.google.Keystone/.keystone_install_lock
... ...

Buscar palabras clave del texto


import pathlib 
import re

keyword = "apple"

# 获取索引文件路径
current_path = pathlib.PurePath(__file__).parent
dbfile = current_path.joinpath("search.db")

# 在索引文件中搜索关键字
with open(dbfile, encoding='utf-8') as f:
    for line in f.readlines():
        if re.search(keyword, line):
            print(line.rstrip())

En el código, uso la función de búsqueda re.search() de expresiones regulares, y uso la variable de palabra clave como la palabra clave de búsqueda para hacer coincidir cada línea del archivo de índice search.db, y finalmente hago coincidir la ruta del archivo de la palabra clave "apple " que aparece en la pantalla junto con el nombre.

Buscar archivos de esta manera es mucho más rápido que usar la propia herramienta de búsqueda del sistema operativo, porque dividí el tiempo que tardaría Windows en buscar archivos en el disco duro en dos partes. En parte, cuando updatedb.py crea el índice; en parte, cuando busca palabras clave en el archivo de índice search.db.

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/121555024
Recomendado
Clasificación