![]() |
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 📁.
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 esploratadirs→ elenco delle cartelle contenute inpathfiles→ elenco dei file contenuti inpath
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
- Per ogni directory visitata, il programma scorre la lista delle cartelle (
dirs). - Confronta il nome della cartella con il termine di ricerca, ignorando maiuscole e minuscole.
- Se c’è una corrispondenza, costruisce il percorso completo e lo aggiunge ai risultati.
- Come per i file, il percorso viene mostrato immediatamente all’utente.
- Alla fine, il programma estrae l’elenco univoco delle cartelle dai risultati trovati (file o cartelle).
- 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
