Basit Sözlük Programı için giriş (sınıf metodu, bezeyicisi... )

Merhaba arkadaşlar. (Sınıflar konusundan öğrendiğim kadarıyla şimdilik bu kadarını yaptım. Çok ufak da olsa eklemek istediğiniz bir şey olursa söylemekten çekinmeyin. Yorumlarınızı bekliyorum… :slight_smile:)

(Ve arkadaşlar sürekli bu notu güncelliyorum.Son güncelleme Tarih:07.02.18 ; Saat:07.05)
*sözcük_sil metoduyla epey uğraştım arkadaşlar. Ama sonunda oldu.
*Bu kodların bulunduğu dosya dizininde bir adet text dosyası oluşturup ismini sözlük koyarak çalıştırırsanız kodlar çalışacaktır.

1 Beğeni

Anlayissizligima verin.Ancak,
Burada liste adli listeyi ne amacla kullandiginizi anlamadim ama eger bu lısteyi kullanacaksaniz bence en sonunda return edin.

Arti burada iki tane ayni dosya acilmis.Bence ya ayni addda tek dosya acin ya da adlari farkli olsun dosyanin.Ek olarak,dosyalarla tehlikeli(tehlikeli de degil ama dogru gorunmeyen) isler yapiyorsunuz bence.Yani bu hazirla adli sinif niteligi tek basina kullanildiktan sonra program direkman kapatilirsa sizin kapatilmamis dosyaniz olacak.Soyle yapmanizi tavsiye ederim.

Bence bu sinif metodunda “sozluk.txt” dosyasini yeniden acip en sonunda bu dosyayi kapatin ve

bu bolumde liste adli degiskeni return edin ve

Bu bolumde tek dosya acmaniz(amacimizi bilemedigimden kusura bakmayin) yeterli bence.Ayrıca bu sinif niteliginde bu dosyalari kapatmayı unutmayın bence.Cunku ilk sinif metodunda ayni dosyayi zaten yeniden acip kapatiyoruz zaten bu degisiklikler yapilirsa.
(Gerci boyle konustum ama sanirim hazirla adli sinif niteligini kullanici kullanmayacak sanirim.O yuzden belki sorun yok ama bence yine de isinizi saglama almanizi oneririm.)
Bu arada gercekten guzel bir calisma.Konulari ogrenme babinda iyi oluyor bu calismalar hakikaten😁.

Önerdiğiniz yol dışında with de kullanılabilir. Hatta en garanti yol budur. Böylece dosya her durumda otomatik olarak kapatılır. Bu şekilde dosyayı kapatmak için kod yazmak zorunda da kalmazsınız. Telefondan yazdığım için bir örnek yazmadım (Zor geldi. :-)), ama internetten with kullanımını kolaylıkla bulabilirsiniz.

İyi çalışmalar.

1 Beğeni

Haklisiniz.Dusunememistim bunu.Tesekkurler.

Merhabalar. Aslında bu sözlük programını sürekli güncelliyorum. @Cihat_Altiparmak söylediklerinizi evet biliyorum eksikler çok. Bazı takıldığım noktalar var oralar detaya giriyor ama söyleyeyim: sözlük.txt dosyasını üstüne ekleme ve okuma moduyla (a+) açtım hem de sadece okuma moduyla (r) açtım. Çünkü sadece ekleme ve okuma moduyla (a+) hazırla foksiyonunda açtığımda komut isteminden sözlük.txt’ i readlines() metodu ile okuduğumda bana boş bir liste verdi. Zaten olan ondan sonra oldu ben düşünmeye başladım ve bugüne bıraktım projemi :smiley:

@ismailarilik söylediğiniz with fonksiyonunun dosyayı close niteliği ile kapattığını bilmiyordum teşekkür ederim. eklemeye çalışacağım. Dosyaların nerede kapandığı nerede açıldığı konusunda ince detaylara girdim sanırım o yüzden bakacağım, ekleyebilirsem ekleyeceğim… :slight_smile:

r+ kipini deneyebilirsiniz.Bu kip dosyayi okuma ve yazma kipinde acar.Dosya icerikleri gitmez.Ekleme yapabilirsiniz yani bu kiple.Ama dikkatli olun.Ornek vereyim.Bunlari size aciklamadan once bir deneme yaptim.
dene.txt

Elma
Armut
Portakal

Diye bir dosyamiz olsun.Simdi ise baslayalim.

with open("dene.txt","r+") as f:
    okunan = f.readlines()   #okunan adli liste bos degildir.
    f.write("Limon")
   # f.close() #zaten with deyimi bu isi goruyor.Bu kod fazlalik

Sonra dosyayi acip bakin ne olmus?Ben soyleyim.

Elma
Armut
PortakalLimon

o yuzden eklemelerinizi de dikkatli yapmanizi oneririm.Soyle yaparsak

with open("dene.txt","r+") as f:
    okunan = f.readlines()   #okunan adli liste bos degildir.
    f.write("\nLimon")  #"\n " bolumune dikkat edin.
  #  f.close() #zaten with deyimi bu isi goruyor.Bu kod fazlalik

Sonuc

Elma
Armut
Portakal
Limon

Dosya islemleri icin yazbel belgelerine de bakilabilir.
Eger yanlisim varsa duzeltiniz lutfen.Memnun kalirim.:blush:

2 Beğeni

Şu çözümü dener misiniz: python - How to read from file opened in "a+" mode? - Stack Overflow

1 Beğeni

with ile dosyayı açtığınızda close metodu ile dosyayı kapatmanıza gerek yok. Bu bloktan çıkmadan zaten dosya kapatılır otomatik olarak.

1 Beğeni

Haklisiniz.Ama niyeyse garatiye alinmis isi de garantiye alasim geliyor.Benimki fuzuli kod kalabaligi:-).

1 Beğeni

Kod yazmada en önemli amaçlardan biri anlaşılır kod yazmak olmalı. Ve fazlalık kodlar anlaşılırlığı bozar. Böyle yapmayalım lütfen. :smile:

1 Beğeni

Sürekli sadeleşmeye gidiyorum aslında ve bazı yanlışlarım oluyor. Uyardığınız için teşekkürler… :slight_smile:

1 Beğeni

@ismailarilik belirttiğiniz çözüme bakacağım mutlaka! :slight_smile:

1 Beğeni

Aaaaa doğru yaa… Jeton şimdi düştü… Zaten “a” kipi dosyanın sonuna ekleme yaptığı için okuyamam ki… ?! Çok sinirlendim şimdi :angry: Aynı zamanda gülüyorum :smiley:

Sözlük uygulamamdaki ‘sözcük_ekle’ , ‘sözcük_sil’ ve ‘hazırla’ fonksiyonlarını tamamladım. Siz de bu kodlara sahip py uzantılı dosyanızın bulunduğu dizinde bir sözlük.txt dosyası oluşturup kodları kontrol edebilirsiniz! (Bir tek eksiği var uygulamanın: silme fonksiyonunda silme işlevini 5 karakterle yerine getiriyor.)‘with’ fonksiyonunu kullanmadım çünkü farklı yerlerde kapanmasını istedim.(İçeriğine farklı fonksiyonlarda ekleme yapabilmek adına…) ‘close’ niteliğini unutmadım. Tekrar görüşlerinizi alabilirim!!!

Soyle bir sey yaptim ama olur mu? Gerci denedim sonuc muspet.Kodlarinda soyle bir düzenleme yaptim.

class Sözlük():
    
    @classmethod
    def sözcük_ekle(cls,Türkçe,İngilizce):
        
        cls.hazırla()
        
        if Türkçe not in cls.liste:
            cls.f.write(Türkçe+' = '+İngilizce+"\n")
            cls.f.close()
            çıktı="{} kelimesi sözlüğe eklendi."
            return çıktı.format(Türkçe)
        else:
            çıkmadı="{} kelimesi sözlükte var!"
            cls.f.close()
            return çıkmadı.format(Türkçe)
            
    
    @classmethod
    def sözcük_sil(cls,türkce):
        with open("sözlük.txt","r+") as f:
            metin_liste = f.readlines()
            f.seek(0)
            eski_metin = f.readlines()
            for i in metin_liste:
                bitis_yeri = int(i.index("=")) - 1            
                kelime_tarama = i[0:bitis_yeri]
                if kelime_tarama == türkce:
                    metin_liste.remove(i)
                    break
        with open("sözlük.txt","w+") as f:           
            f.writelines(metin_liste)
            
        if eski_metin == metin_liste:
            print("Sozlukte boyle bir kelimr yok.")
        else:
            print("{} kelimesi sözlükten silindi.".format(türkce))
        
    @classmethod
    def hazırla(cls):
        cls.liste=['']
        cls.f=open("sözlük.txt", "a+")
        cls.son_kar=cls.f.tell()
        cls.f.seek(0)
        cls.veri_liste = cls.f.readlines()
        cls.f.seek(cls.son_kar)
        
        for satır in cls.veri_liste:
            cls.liste.extend(satır.split(" = "))
        
        return cls.liste        
    #@classmethod
    #def ara(cls):
    #cls.hazırla()

Sözcük ekle ve hazirla adli sinif niteliklerini de ayrica inceleyecegim insallah.Su anlik bu kodda
sözcük_sil ile sözcük_ekle niteliklerinde sorun yok,doğru calisiyor ikisi de.
Edit: sözcük_sil adli sinif niteligi degistirildi.

1 Beğeni

Bence her yazma yaptıktan sonra dosyayı kapatın. Diğer türlü, program kapandığında dosya açık kalırsa değişiklikler kaydedilmemiş olabilir ya da dosyayı tekrar açmada sorun çıkabilir. Eğer kapatıp açmak masraflı olur derseniz dosya nesnelerinin flush metoduna bakın derim. Bu metod dosyayı kapatmaz ama değişiklikleri dosyaya kaydeder.

1 Beğeni

Cihat bey hazırla adlı sınıf metodunda bu dediğiniz dosyayı açtım tekrar açınca siz bütünleşik olmadı. Bir de bu metin_liste ve eski_metin karşılaştırması olmamış gibi. Benim sözlük adlı dosyam var ve eski_metin de metin_liste de aynı içeriği verecek bana. Pek anlayamadım sanırım…

1 Beğeni

Kusura bakmayin bu yonu anlayamadim.Ayrica sadece silme islemi bolumunu editledim.Digerlerine ayrica bakacagimi belirttim :grin:.hazirla bolumune dokunmadim.Ek olarak sahsen bu hazirla metodunun gereksiz bir sey oldugunu dusunuyorum.Sabah buna ayrica bakacagim :grin:.

Dikkatli bakin(ya da ben dikkatli olayim bi dahaki sefere:-)).Eger kelime silme islemi yaparsaniz bu listeler ayni ciktiyi vermez.Bunu sunum icin yaptim.Once eski dosya verilerini aliyorum.Sonra islemi yapiyorum.Eger bu islem sonucunda silinecek kelime yoksa zaten bir islem yapmayacak,bu yuzden de metin_liste degismiyecek.İste burada
Eger eski_liste == metin_liste ise dedim programa(kisaca metin icerigi degismemis ise)
print(“Sozlukte boyle bir kelimr yok.”) bastir.
Kisaca

if eski_metin == metin_liste:. #eger gerceklesen bir silme islemi yoksa,(ki bu,belirtilen kelimenin olmadigi anlamina gelir.)
    print("Sozlukte boyle bir kelimr yok.")

Anlayamadiginiz yerde bilgim dahilinde yardimci olmaya calisirim.

1 Beğeni

Sanırım kod yoğunluğu bayağı fazla ve veri tipi ile belge düzenleme meselesinden dolayı kodlar içerisinde kayboldum. Fakat işin içinden çıkabildim. Geriye dönüp bu kodlara baksam diyorum evet anlayabilebilsem bile okunaklı olmadığını gördüm. Açıklayıcı metinler döşersem dosyaya çok daha iyi olur fakat kendimi geliştirici bir proje olduğu için çok ilerisine gidebilirim de, gitmeyebilirim de. O yüzden daha kısa nasıl yazılır bunlar için düşüneceğim… Yorumlarınızı tekrardan beklerim!