![]() |
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.
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 inroot.- 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
exitin 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\DesktopCome funziona
- Ogni percorso di file trovato viene memorizzato in
found_files. - Un
setviene 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
