🕵️📁 Tool di ricerca file in locale (parte 2): Ricerca cartelle

  

Se ti sei perso l'articolo sulla costruzione di un tool in python per la ricerca di file in locale, allora ti consiglio di dare un occhio qui 🕵️ Creare un tool di ricerca dei tuoi file locali in Python prima di leggere questo articolo. Se invece sei un lettore gold di Techelopment 😊, conosci già il tool di cui stiamo parlando. 

In questo articolo vederemo come evolvere il tool per estendere la ricerca anche alle cartelle 📁. 

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

Obiettivo

L’obiettivo di questa evoluzione del tool è estendere la ricerca oltre i nomi dei file, includendo anche i nomi delle cartelle presenti nel filesystem. In questo modo l’utente può individuare non solo documenti, immagini o altri file che corrispondono al criterio di ricerca, ma anche directory che contengono quel nome. Il comportamento generale rimane lo stesso:

  • ricerca completa nel filesystem (con os.walk)
  • tempo totale della ricerca
  • visualizzazione dei risultati
  • possibilità di aprire le cartelle trovate
  • nessuna duplicazione nell’elenco delle cartelle
  • aggiunta dell'icona 📄 per i file e 📁 per le cartelle dei risultati di ricerca

L’estensione è completamente trasparente all’utente: basta inserire un nome e il programma cerca ovunque, in file e cartelle.


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 or folder name (or type 'exit' to quit'): ").strip()
    if name.lower() == "exit":
        print("Program terminated.")
        break

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

    found_paths = []  # now contains both files and folders

    for path, dirs, files in os.walk(root):

        # ---- search inside folder names ----
        for dirname in dirs:
            if name.lower() in dirname.lower():
                folder_path = os.path.join(path, dirname)
                found_paths.append(folder_path)
                print("📁 Found folder:", folder_path)

        # ---- search inside file names ----
        for filename in files:
            if name.lower() in filename.lower():
                file_path = os.path.join(path, filename)
                found_paths.append(file_path)
                print("📄 Found file:", file_path)

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

    if not found_paths:
        print("No files or folders found.\n")
        continue

    # Extract unique folders from results
    unique_folders = set()

    for p in found_paths:
        if os.path.isdir(p):
            # p is a found folder
            unique_folders.add(p)
        else:
            # p is a file → use its parent directory
            unique_folders.add(os.path.dirname(p))

    unique_folders = sorted(unique_folders)

    # Ask user if they want to open a folder
    while True:
        print("\nWould you like to open one of the folders?")
        print("Enter the number to open it, or type 'no' to continue.\n")

        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 file: C:\Users\Example\Desktop\project.txt
📄 Found file: C:\Users\Example\Desktop\project.xlsx
📁 Found folder: C:\Users\Example\Desktop\Project

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
2) C:\Users\Example\Project
> 2
Opening: C:\Users\Example\Desktop\Project

Come funziona

Per aggiungere la ricerca anche nei nomi delle cartelle, il programma sfrutta la struttura già fornita da os.walk().
Questa funzione restituisce tre elementi:

for path, dirs, files in os.walk(root):
  • path → directory corrente esplorata
  • dirs → elenco delle cartelle contenute in path
  • files → elenco dei file contenuti in path

Nella versione precedente venivano analizzati solo i file. Ora, con poche righe aggiunte, il programma controlla anche ogni nome di cartella:

for dirname in dirs:
    if name.lower() in dirname.lower():
        folder_path = os.path.join(path, dirname)
        found_paths.append(folder_path)
        print("Found folder:", folder_path)

Cosa succede nel dettaglio

  1. Per ogni directory visitata, il programma scorre la lista delle cartelle (dirs).
  2. Confronta il nome della cartella con il termine di ricerca, ignorando maiuscole e minuscole.
  3. Se c’è una corrispondenza, costruisce il percorso completo e lo aggiunge ai risultati.
  4. Come per i file, il percorso viene mostrato immediatamente all’utente.
  5. Alla fine, il programma estrae l’elenco univoco delle cartelle dai risultati trovati (file o cartelle).
  6. L’utente vede tutte le cartelle rilevanti e può aprirle con un numero.


Conclusione

Grazie a questa modifica, il motore di ricerca diventa più potente e completo, restando al tempo stesso semplice e leggibile.

Buona ricerca 🔎!


 


Follow me #techelopment

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