🕵️ Creare un tool di ricerca dei tuoi file locali in Python

  

In questo articolo, illustreremo l'evoluzione di un programma Python basato su console che cerca file sul file system. Inizieremo con una versione semplice, per poi migliorarla progressivamente aggiungendo interazione persistente, tempi di esecuzione ottimizzati e, infine, la possibilità di aprire le cartelle in cui si trovano i risultati della ricerca.

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

1. Fase 1 — Ricerca di base dei file sul file system

Obiettivo

Creare uno script Python che esegua la ricerca in una directory e nelle sue sottodirectory per trovare i file il cui nome contiene una determinata parola chiave. Il programma si interrompe dopo la prima ricerca.

Codice

import os

root = input("Search in: ")
name = input("File name: ")

for path, _, files in os.walk(root):
    for filename in files:
        if name.lower() in filename.lower():
            print("Found:", os.path.join(path, filename))

Esempio di Output

Search in: C:\Users\Example\Documents
File name: report
Found: C:\Users\Example\Documents\Work\report_final.pdf
Found: C:\Users\Example\Documents\Notes\meeting_report.txt

Come funziona

  • os.walk(root) esegue un'iterazione su tutte le directory, sottodirectory e file presenti in root.
  • Ogni file viene controllato per verificare se il suo nome contiene la sottostringa fornita dall'utente.
  • La ricerca non distingue tra maiuscole e minuscole.
  • Lo script stampa il percorso completo di ogni file corrispondente.

2. Fase 2 — Ripetere le ricerche senza riavviare il programma

Obiettivo

Modificare il programma in modo che continui a richiedere nuove ricerche finché l'utente non digita exit

Aggiungere inoltre:

  • la possibilità di convalidare i percorsi
  • eseguire ricerche più volte
  • calcolare il tempo di elaborazione

Codice

import os
import time

while True:
    root = input("Search in (or type 'exit' to quit): ").strip()
    if root.lower() == "exit":
        print("Program terminated.")
        break

    if not os.path.isdir(root):
        print("Invalid path.\n")
        continue

    name = input("File name (or type 'exit' to quit): ").strip()
    if name.lower() == "exit":
        print("Program terminated.")
        break

    start_time = time.time()
    found = False

    for path, _, files in os.walk(root):
        for filename in files:
            if name.lower() in filename.lower():
                print("Found:", os.path.join(path, filename))
                found = True

    duration = time.time() - start_time

    if not found:
        print("No files found.")

    print(f"Search completed in {duration:.3f} seconds.\n")

Esempio di Output

Search in (or type 'exit' to quit): C:\Projects
File name (or type 'exit' to quit): config
Found: C:\Projects\App1\config.json
Found: C:\Projects\Library\config_template.ini
Search completed in 0.134 seconds.

Search in (or type 'exit' to quit): exit
Program terminated.

Come funziona

  • L'intero processo di ricerca è racchiuso in un ciclo while True, quindi si ripete.
  • L'utente può digitare exit in qualsiasi momento per uscire.
  • Le directory non valide vengono gestite correttamente.
  • time.time() viene utilizzato per misurare la durata di ogni ricerca.

3. Fase 3: apertura delle cartelle dei risultati della ricerca

Obiettivo

Dopo aver eseguito una ricerca, il programma dovrebbe elencare tutte le cartelle univoche in cui sono stati trovati i file corrispondenti. L'utente può quindi scegliere un numero dall'elenco per aprire la cartella in Esplora file di sistema.

Codice

import os
import time
import subprocess
import platform

def open_folder(path):
    system = platform.system()

    if system == "Windows":
        os.startfile(path)
    elif system == "Darwin":  # macOS
        subprocess.Popen(["open", path])
    else:  # Linux
        subprocess.Popen(["xdg-open", path])


while True:
    root = input("Search in (or type 'exit' to quit): ").strip()
    if root.lower() == "exit":
        print("Program terminated.")
        break

    if not os.path.isdir(root):
        print("Invalid path.\n")
        continue

    name = input("File name (or type 'exit' to quit): ").strip()
    if name.lower() == "exit":
        print("Program terminated.")
        break

    print("\nSearching...")
    start_time = time.time()

    found_files = []

    for path, _, files in os.walk(root):
        for filename in files:
            if name.lower() in filename.lower():
                file_path = os.path.join(path, filename)
                found_files.append(file_path)
                print("Found:", file_path)

    duration = time.time() - start_time
    print(f"\nSearch completed in {duration:.3f} seconds.")

    if not found_files:
        print("No files found.\n")
        continue

    unique_folders = sorted({os.path.dirname(f) for f in found_files})

    while True:
        print("\nWould you like to open one of the folders?")
        print("Enter the number to open it, or type 'no' to continue.")

        for i, folder in enumerate(unique_folders, 1):
            print(f"{i}) {folder}")

        choice = input("> ").strip()

        if choice.lower() == "no":
            print("")
            break

        if choice.isdigit():
            index = int(choice)
            if 1 <= index <= len(unique_folders):
                folder = unique_folders[index - 1]
                print(f"Opening: {folder}")
                open_folder(folder)
            else:
                print("Invalid number.")
        else:
            print("Invalid input.")

Esempio di Output

Searching...
Found: C:\Users\Example\Desktop\todo.txt
Found: C:\Users\Example\Desktop\notes.txt

Search completed in 0.041 seconds.

Would you like to open one of the folders?
Enter the number to open it, or type 'no' to continue.
1) C:\Users\Example\Desktop
> 1
Opening: C:\Users\Example\Desktop

Come funziona

  • Ogni percorso di file trovato viene memorizzato in found_files.
  • Un set viene utilizzato per estrarre directory univoche, evitando duplicati.
  • Il programma elenca le cartelle numerate.
  • L'utente sceglie quale cartella aprire digitandone il nome numero.
  • open_folder() apre le cartelle utilizzando i comandi appropriati per il sistema operativo:
    • Windows → os.startfile()
    • macOS → open
    • Linux → xdg-open

Conclusione

Abbiamo progressivamente trasformato un semplice script di ricerca nel file system in uno strumento più robusto e interattivo, in grado di effettuare ricerche ripetute, misurare le prestazioni e aprire cartelle. Ogni miglioramento si basa sul precedente, dimostrando come le utility pratiche di Python possano evolversi passo dopo passo.

Se desideri approfondire ulteriormente, potresti aggiungere:

  • Apertura di file invece che di cartelle,
  • Conteggio dei risultati per cartella,
  • Esportazione dei risultati in un file CSV,
  • O addirittura trasformazione in un'app GUI.

Buona programmazione!



Follow me #techelopment

Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment