๐Ÿ•ต️๐Ÿ“ 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