Tüm dosyaları tarayıp, konumu bulabilmenin yolu var mıdır bilmem fakat önceden belirlediğiniz bazı dosya dizinlerini tarayabilirsiniz
Örnek:
import os
dizinler = ["proje_1", "proje_2", "proje_3"]
arananlar = ["A.py", "B.py"]
for dizin in dizinler:
path = r"C:\python\{0}".format(dizin)
for file in os.listdir(path=path):
if file in arananlar:
print(f"{file}, {path} içerisinde bulundu!")
*python isimli bir dosyada proje_1, proje_2 ve proje_3 isimli klasörler var. Bu klasörlerin içinde de sırasıyla A.py, B.py ve C.py bulunuyor. Programı çalıştırdığımızda şöyle bir çıktı alıyoruz:
A.py, C:\python\proje_1 içerisinde bulundu!
B.py, C:\python\proje_2 içerisinde bulundu!
Edit: Çok daha geniş kapsamlı bir arama yapabilmenin yolunu buldum diyebilirim.
import os
import time
# Dosyaları bulmak için 'os' modülünü kullanacağız.
# İşlemin kaç saniye sürdüğünü hesaplamak için ise 'time' modülünü kullanacağız.
class DosyaBulucu:
def __init__(self):
self.baslangic_konumu = r"C:/Games" # Aramaya başlanacak konum.
self.arananlar = ["A.py", "B.py"] # Aranan dosyaların listesi.
self.bulunanlar = {} # Bulunan dosyaların yer alacağı sözlük.
def ara(self, konum):
# Bulmayı istediğimiz dosyaları aramak için kullanacağımız fonksiyon.
try:
tum_dosyalar = os.listdir(konum) # Verilen konumdaki tüm dosyaları listeler.
klasorler = [] # Yalnızca klasör tipindeki dosyaların yer alacağı liste.
for i in range(len(tum_dosyalar)):
dosya = tum_dosyalar[i]
dosya_tipi = os.path.splitext(r"{0}/{1}".format(konum, dosya))[1] # dosya formatı/tipi, Örn: .py
if dosya_tipi == "":
# Özel bir formata sahip değilse 'klasör' olduğu varsayılır.
# Klasör değilse de 'except' bloğunda üstesinden geliniyor.
klasorler.append(dosya)
if dosya in self.arananlar:
if dosya in self.bulunanlar:
# Dosya daha önce bulunmuşsa, listeye ekleme yapılır.
self.bulunanlar[dosya] += [r"{0}/{1}".format(konum, dosya)]
else:
# Bulunmadıysa da yenisi oluşturulur.
self.bulunanlar.update({dosya: [r"{0}/{1}".format(konum, dosya)]})
for klasor in klasorler:
try:
# Özyineleme ile fonksiyon tekrar tekrar çağırılır.
# Böylece bir dizinde yer alan diğer tüm dizinler de gözden geçirilmiş olunur.
self.ara(konum=r"{0}/{1}".format(konum, klasor))
except (PermissionError, NotADirectoryError) as exception:
if isinstance(exception, PermissionError):
# Bazı dosyaların içine bakamıyoruz. İzin alınamadı hatası veriyor.
print(r"Dosya için izin alınamadı: {0}/{1}".format(konum, klasor))
elif isinstance(exception, NotADirectoryError):
# Belirli bir dosya formatına sahip olmayan, fakat klasör de olmayan dosyalar bu hatayı verecektir.
print(r"Dosya tipi tanımlanamadı: {0}/{1}".format(konum, klasor))
except (FileNotFoundError, RecursionError) as exception:
print(exception)
if isinstance(exception, FileNotFoundError):
print(f"Belirtilen dosya konumu bulunamadı: {konum}")
elif isinstance(exception, RecursionError):
# Özyinelemi fonksiyonların 'dallanma' sınırından ötürü ortaya çıkan hata.
# Eğer çok fazla klasörün bulunduğu bir yerde arama yapacak olursak, bu hatanın çıkması çok olası.
print("Sınır aşımı hatası, arama işlemi durduruldu!")
DB = DosyaBulucu()
baslangic = time.perf_counter()
DB.ara(konum=DB.baslangic_konumu)
print(DB.bulunanlar)
bitis = time.perf_counter()
print(f"İşlemler {round(bitis - baslangic, 3)} saniyede tamamlandı!")
Toplam boyutu yaklaşık 51 GB olan bir dosyanın bazı bölümlerine A.py ve B.py isimli dosyaları sakladım ve yukarıdaki kodu çalıştırdım. Aldığım çıktı ise şu şekilde:
{'A.py': ['C:/Games/Factorio/A.py'], 'B.py': ['C:/Games/Fallout 4/B.py', 'C:/Games/OMD3/B.py']}
İşlemler 0.505 saniyede tamamlandı!