Dosya Konumunu Öğrenmek

Merhaba Arkadaşlar ,

Diyelim Elimizde A.py ve B.py diye iki farklı Python dosyamız mevcut ben A.py dosyamdan B.py’ nin dosya konumunu öğrenmek istiyorum nasıl yapabilirim . os modülü yada başka modüllerde böyle bir kolaylık sağlayan fonksiyon var mıdır ?

Teşekkürler şimdiden

Bu dosyaların ikisi de aynı dizindemi bulunuyor ?

os modülünün listdir() fonksiyonu işinize yarayabilir diye düşünüyorum.
Bir döngü işlemi sonucu, Bilgisayardaki dizinlerde içerisinde arama yaptırıp, dosya bulunduğunda, konumu ekrana yazdırılabilir.
Kaynak:
https://python-istihza.yazbel.com/standart_moduller/os.html

1 Beğeni

Yapamazsin.

Su yazdigin kadariyla A ile B arasinda hic bir alaka yok.

Soyle dusun: Dunyada muhtemelen binlerce B.py dosyasi var. Hangisinin konumunu ogrenmek istiyorsun?

1 Beğeni

Bununla ilgili bir kütüphane varmı bilmiyorum fakat işletim sisteminin bazı özelliklerini kullanabilirsiniz mesela linux için Yazdığınız detaylı bir find komutu işinizi görecektir.

import os

os.system("find /home -name b.py")

Burada basit bir kullanım yaptım siz kendi isteklerinize göre daha detaylı sorgular yazabilirsiniz. Windows tarafında da cmd veya powershell için benzer komutlar vardır araştırabilirsiniz.

Not: root yetkileri ile çalıştırılan bir find komutu ile çoğu dizini tarayabilirsiniz.

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ı!
1 Beğeni

Hatanın türünü bu şekilde if ile ikinci defa kontrol etmek yerine birden fazla except kullanabilirsiniz:

2 Beğeni