Python OS Modülüyle Bütün Dosyaları Tarama

157134

Kilopat
Katılım
22 Şubat 2017
Mesajlar
1.636
Makaleler
3
Çözümler
5
Merhaba. Ödevim şöyle:

Ekran Alıntısı.PNG


Kodları yazdırdım ve denedim sorunsuz çalışıyor ama bütün dosyaları tarayamadım. Bütün dosyaları tarayabilmem için sistem yoluna ne yazmam gerek? Ayrıca Python'u öğrendiğim için kodlarımı değerlendirirseniz sevinirim. Kodlar:

Python:
import os

def dosyayazdir(isim,belge):
dosyalar = []

with open("{}".format(belge),"r+",encoding="utf-8") as file:
for i in file:
i = i.strip("\n")
dosyalar.append(i)
if not (isim in dosyalar):
file.write(isim + "\n")

dosyalar = os.walk("C:/Users/user\Desktop")

for kyolu,kisimleri,disimleri in dosyalar:
for i in disimleri:
if i.endswith(".txt"):
dosyayazdir(i,"txt_dosyalari.txt")
elif i.endswith(".mp4"):
dosyayazdir(i,"mp4_dosyaları.txt")
elif i.endswith(".pdf"):
dosyayazdir(i,"pdf_dosyalari.txt")

@Vavien. Siz de göz atarsanız sevinirim.
 
Son düzenleyen: Moderatör:
Bilgisayarda C, D gibi diskler olduğu için herbiri için bu işlemi yapman lazım. Onları da bir diziye kaydetip iterasyona sokarak yapabilirsin bu işlemi. Kodların iyi gözüküyor sadece gözüme takılan; dosya isimlendirmelerini Türkçe yazman, bunları İngilizce isimlendirirsen senin için daha iyi olacaktır.
 
Bilgisayarda C, D gibi diskler olduğu için herbiri için bu işlemi yapman lazım. Onları da bir diziye kaydetip iterasyona sokarak yapabilirsin bu işlemi. Kodların iyi gözüküyor sadece gözüme takılan; dosya isimlendirmelerini Türkçe yazman, bunları İngilizce isimlendirirsen senin için daha iyi olacaktır.
Python Türkçe isimlendirmeye izin veriyor diye kullanıyorum. Ayrıca bir satırda birden fazla yol tanımlayabiliyor muyuz?
 
Öncelikle Python'a o kadar da hakim değilim.

İlk gördüğüm şey girinti yapmaman. Ya da kopyalarken kayboldu. Python buna göre çalışır.
Mesela .walk diyerek iterator alınabildiğini bilmiyordum. Hiç lazım olmadı çünkü ama Python gibi bir dilde o işi yapmanın yolunun olduğunu her zaman biliyordum.

2 saattir os.walk niye çalışmıyor diye düşünüyorum, kullanıcı adımı oraya yazmamışım...

İnternette bütün dosyalar için "\\" koymak yeterli demişler. Ama yine de sanırım sadece C diskine bakıyor çünkü D diskimdeki .mp4 dosyaları çıkmadı... Öyleymiş. Direkt "C:\\" ya da "D:\\" şeklinde yapın.
Normalde iki kere olacak şekilde \\ yazmayı sevmediğim için tersini kullanırım ama bu sefer dosyaya da baş kısmını ters yazdırıyor ve bu hiç hoş değil. O yüzden os.walk()'ta \\ kullandım. İki kere olmasının sebebi kaçış karakterleri, escape sequences diye de geçer. zaten \n kullanmışsın, biliyorsundur herhalde. Bilmiyorsan bakarsın karışık bir şey değil.
Tüm bilgisayarı bu kadar hızlı taraması da biraz garip geldi. D diskinde daha az veri olmasına rağmen daha uzun bekletti. Bitmiş ama bitti yazmamış...

Tüm diskler için şu an bir şey bulamadım. Daha program nasıl çalışıyor ona bakıyorum.
Tüm dünya root, dirs ve files olarak kullanırken senin cins isimlendirmen kafamı karıştırdı 😄
Dosya adresini de koydum ne nerdeymiş tam anlaşınsın.

Çalıştırmadan önce dosyaları oluşturmak gerekiyor. O beni biraz gıcık etti. Opsiyonel olarak ufak kısım ekledim.

Yazdırırken kontrol etmek yerine sıfırdan dosyayı oluşturabilirsiniz. Bu sayede tekrarları kontrol etmenize de gerek kalmaz. os.walk() zaten tekrar eden sonuçlar vermez.

Dosyayı da sürekli aç-kapa yapmak çok mantıklı değil. Onun bir maliyeti var. Zaman ve işlem gücü olarak. Bunun yerine dosyayı başta açıp yeri geldiğinde yazmak daha mantıklı bence. Yani fonksiyona gerek yok. En azından ben öyle yapardım. Bu şekilde de çalışıyor mu? Evet. Ama diğeri daha hızlı olacaktır. C diskini tararken anında bitmediği fark ediliyor. Daha önce bir bir işlem yapmadığım için normalde ne kadar sürmeli bilmiyorum. Python'ın yavaşlığı mı yoksa verimli kod yazılmaması mı bilemiyorum. Tabii ticari bir şey olmadığı için süresi çok da önemli değil. Size kalmış.
Şu an gayet güzel çalışıyor. Güzel yazmışsınız. Çok ufak değişiklikler yaptım. Yapmadım desem bile yeridir.

Dosyayı eklerken kontrol etmeyeceksen işlemden önce eski dosyayı silmende fayda var. Onu yorum olarak bıraktım.
Python Türkçe isimlendirmeye izin veriyor diye kullanıyorum.
İzin veriyor ama yine de kullanmamalısın. Tercih edilen bir şey değil. Windows 10 bile Türkçe sorununa çözüm için kullanıcı adını mail adresinin ilk 5 karakteri yapma kararı aldı.
 
Öncelikle Python'a o kadar da hakim değilim.

İlk gördüğüm şey girinti yapmaman. Ya da kopyalarken kayboldu. Python buna göre çalışır.
Mesela .walk diyerek iterator alınabildiğini bilmiyordum. Hiç lazım olmadı çünkü ama Python gibi bir dilde o işi yapmanın yolunun olduğunu her zaman biliyordum.

2 saattir os.walk niye çalışmıyor diye düşünüyorum, kullanıcı adımı oraya yazmamışım...

İnternette bütün dosyalar için "\\" koymak yeterli demişler. Ama yine de sanırım sadece C diskine bakıyor çünkü D diskimdeki .mp4 dosyaları çıkmadı... Öyleymiş. Direkt "C:\\" ya da "D:\\" şeklinde yapın.
Normalde iki kere olacak şekilde \\ yazmayı sevmediğim için tersini kullanırım ama bu sefer dosyaya da baş kısmını ters yazdırıyor ve bu hiç hoş değil. O yüzden os.walk()'ta \\ kullandım. İki kere olmasının sebebi kaçış karakterleri, escape sequences diye de geçer. zaten \n kullanmışsın, biliyorsundur herhalde. Bilmiyorsan bakarsın karışık bir şey değil.
Tüm bilgisayarı bu kadar hızlı taraması da biraz garip geldi. D diskinde daha az veri olmasına rağmen daha uzun bekletti. Bitmiş ama bitti yazmamış...

Tüm diskler için şu an bir şey bulamadım. Daha program nasıl çalışıyor ona bakıyorum.
Tüm dünya root, dirs ve files olarak kullanırken senin cins isimlendirmen kafamı karıştırdı 😄
Dosya adresini de koydum ne nerdeymiş tam anlaşınsın.

Çalıştırmadan önce dosyaları oluşturmak gerekiyor. O beni biraz gıcık etti. Opsiyonel olarak ufak kısım ekledim.

Yazdırırken kontrol etmek yerine sıfırdan dosyayı oluşturabilirsiniz. Bu sayede tekrarları kontrol etmenize de gerek kalmaz. os.walk() zaten tekrar eden sonuçlar vermez.

Dosyayı da sürekli aç-kapa yapmak çok mantıklı değil. Onun bir maliyeti var. Zaman ve işlem gücü olarak. Bunun yerine dosyayı başta açıp yeri geldiğinde yazmak daha mantıklı bence. Yani fonksiyona gerek yok. En azından ben öyle yapardım. Bu şekilde de çalışıyor mu? Evet. Ama diğeri daha hızlı olacaktır. C diskini tararken anında bitmediği fark ediliyor. Daha önce bir bir işlem yapmadığım için normalde ne kadar sürmeli bilmiyorum. Python'ın yavaşlığı mı yoksa verimli kod yazılmaması mı bilemiyorum. Tabii ticari bir şey olmadığı için süresi çok da önemli değil. Size kalmış.
Şu an gayet güzel çalışıyor. Güzel yazmışsınız. Çok ufak değişiklikler yaptım. Yapmadım desem bile yeridir.

Dosyayı eklerken kontrol etmeyeceksen işlemden önce eski dosyayı silmende fayda var. Onu yorum olarak bıraktım.

İzin veriyor ama yine de kullanmamalısın. Tercih edilen bir şey değil. Windows 10 bile Türkçe sorununa çözüm için kullanıcı adını mail adresinin ilk 5 karakteri yapma kararı aldı.
Girintileri bırakıyorum o Technopattan kaynaklı. Daha tam İngilizcem olmadığı için Türkçe yazıyorum.

Kyolu = Klasör yolu
Kisimleri = Klasör isimleri
Disimleri = Dosya isimlerine denk geliyor.

O dosyaları aslında oluşturmak gerekmiyordu. Eğer yoksa dosyaları otomatik oluşturuyordu ama öyle olunca her çalıştırmam da aynı verileri üst üste yazınca düzeltmek zorunda kaldım. Direk üstüne yazınca da dosyaları eksik çıkarıyordu.

Aslında başta fonksiyon tanımlamamıştım ama sonradan kodun kısa olması için fonksiyon tanımladım.

Dosya kontrolü fonksiyonda geçiyordu. Eğer dosya belgede varsa yazdırmıyordum.
Python:
if not (isim in dosyalar):
    file.write(isim + "\n")
Burası.
 
Tüm dosyaları gezdiği için açtığın dosya boş olursa o dosyanın belgede olma ihtimali olmuyor. Kontrole de gerek kalmaz.
Sen dosyayı r+ olarak açıyorsun. Dosya yoksa hata verir. Masaüstünde txt_dosyalari.txt isimli dosyası olmayan bilgisayarda hata verir o program.
Değişken adları ufak başlar genel kuraldır. Sabitler büyük harf olur. Sınıfların ise il harfi büyük olur. O değişken adlarını klasorYolu, klasorIsimleri, dosyaIsimleri yapmanı tavsiye ederim. Bazıları alt çizgi ile ayırıyor bazıları böyle yapıyor.
os.walk() tekrar etmeyeceği için senin kontrol etmen gerekmiyor. a+ ile açıp kapatmak dosyanın kesinlikle oluşmasını sağlar. Buna ek olarak w+ ile açarsan da içeriği silinir. w+ dosya yoksa oluşturur ama yazmaya çalışırsan hata verir demişler.
Dediğim gibi şu an çalışıyor. Yapman şart değil. Ama ilerde bu tip iyileştirmeleri düşünmek, onları uygulamak işine gelir.
Bu arada kodu atmayı unutmuşum. Yorumlu kısım dosya varsa siliyor. İstersen açarsın.

Python:
import os

def dosyayazdir(isim, belge):
    dosyalar = []

    with open("{}".format(belge),"r+",encoding="utf-8") as file:
        for i in file:
            i = i.strip("\n")
            dosyalar.append(i)
        if not (isim in dosyalar):
            file.write(isim + "\n")

dosyalar = os.walk("D:\\")

"""if os.path.exists("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt"):
    os.remove("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")
if os.path.exists("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt"):
    os.remove("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")
if os.path.exists("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt"):
    os.remove("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")"""


file1 = open("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt", "a+")
file2 = open("C:/Users/KULLANICIADI/Desktop/pdf_dosyalari.txt", "a+")
file3 = open("C:/Users/KULLANICIADI/Desktop/mp4_dosyalari.txt", "a+")

file1.close()
file2.close()
file3.close()

for kyolu, kisimleri, disimleri in dosyalar:
    for i in disimleri:
        if i.endswith(".txt"):
            dosyayazdir(kyolu + i,"C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")
        elif i.endswith(".mp4"):
            dosyayazdir(kyolu + i,"C:/Users/KULLANICIADI/Desktop/mp4_dosyalari.txt")
        elif i.endswith(".pdf"):
            dosyayazdir(kyolu + i,"C:/Users/KULLANICIADI/Desktop/pdf_dosyalari.txt")
 
Tüm dosyaları gezdiği için açtığın dosya boş olursa o dosyanın belgede olma ihtimali olmuyor. Kontrole de gerek kalmaz.
Sen dosyayı r+ olarak açıyorsun. Dosya yoksa hata verir. Masaüstünde txt_dosyalari.txt isimli dosyası olmayan bilgisayarda hata verir o program.
Değişken adları ufak başlar genel kuraldır. Sabitler büyük harf olur. Sınıfların ise il harfi büyük olur. O değişken adlarını klasorYolu, klasorIsimleri, dosyaIsimleri yapmanı tavsiye ederim. Bazıları alt çizgi ile ayırıyor bazıları böyle yapıyor.
os.walk() tekrar etmeyeceği için senin kontrol etmen gerekmiyor. a+ ile açıp kapatmak dosyanın kesinlikle oluşmasını sağlar. Buna ek olarak w+ ile açarsan da içeriği silinir. w+ dosya yoksa oluşturur ama yazmaya çalışırsan hata verir demişler.
Dediğim gibi şu an çalışıyor. Yapman şart değil. Ama ilerde bu tip iyileştirmeleri düşünmek, onları uygulamak işine gelir.
Bu arada kodu atmayı unutmuşum. Yorumlu kısım dosya varsa siliyor. İstersen açarsın.

Python:
import os

def dosyayazdir(isim, belge):
    dosyalar = []

    with open("{}".format(belge),"r+",encoding="utf-8") as file:
        for i in file:
            i = i.strip("\n")
            dosyalar.append(i)
        if not (isim in dosyalar):
            file.write(isim + "\n")

dosyalar = os.walk("D:\\")

"""if os.path.exists("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt"):
    os.remove("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")
if os.path.exists("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt"):
    os.remove("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")
if os.path.exists("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt"):
    os.remove("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")"""


file1 = open("C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt", "a+")
file2 = open("C:/Users/KULLANICIADI/Desktop/pdf_dosyalari.txt", "a+")
file3 = open("C:/Users/KULLANICIADI/Desktop/mp4_dosyalari.txt", "a+")

file1.close()
file2.close()
file3.close()

for kyolu, kisimleri, disimleri in dosyalar:
    for i in disimleri:
        if i.endswith(".txt"):
            dosyayazdir(kyolu + i,"C:/Users/KULLANICIADI/Desktop/txt_dosyalari.txt")
        elif i.endswith(".mp4"):
            dosyayazdir(kyolu + i,"C:/Users/KULLANICIADI/Desktop/mp4_dosyalari.txt")
        elif i.endswith(".pdf"):
            dosyayazdir(kyolu + i,"C:/Users/KULLANICIADI/Desktop/pdf_dosyalari.txt")
Ben dosya içeriğin de okumak için "r+" yaptım ama orayı hesaba katamamışım. Yazma kısmında zamanım dardı o yüzden kısaltmalı yazdım. O dediğiniz kuralıda biliyorum ancak C#'da genelde kullanıyorum onu. Bundan sonra kullanmaya dikkat ederim. Teşekkür ederim.
 
Uyarı! Bu konu 6 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı