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")
Python Türkçe isimlendirmeye izin veriyor diye kullanıyorum. Ayrıca bir satırda birden fazla yol tanımlayabiliyor muyuz?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.
İ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ı.Python Türkçe isimlendirmeye izin veriyor diye kullanıyorum.
Girintileri bırakıyorum o Technopattan kaynaklı. Daha tam İngilizcem olmadığı için Türkçe yazıyorum.Ö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ı.
if not (isim in dosyalar):
file.write(isim + "\n")
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.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")