![]() |
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
