Dosya işlemlerinde TypeError

TURKISH_ALPHABET = "abcçdefgğhıiklmnoöprsştuüvyzABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ"

class Frequance():
    def __init__(self, file):
        self.file = file
        self.result = {char: 0 for char in TURKISH_ALPHABET}

        with open(self, self.file) as f:
            while True:
                char = f.read(1)
                if char in TURKISH_ALPHABET:
                    self.result[char] += 1
                else:
                    break
        print(self.result)


nygma = Frequance('text.txt')

TypeError: expected str, bytes or os.PathLike object, not Frequance

Bunun sebebi nedir?

Hatanin ciktigi satirda yapmak istedigin nedir?

https://docs.python.org/3/library/functions.html#open

Bir dosyanın içerisindeki harflerden kaçar tane olduğunu bulup, bu veriyi bir sözlükte tutmak. Ve en son bu sözlüğü standart çıkışa yazdırmak. @aib Problem fonksiyona self parametresi vermektenmiş.

class Frequance():
    def __init__(self, file):
        self.file = file
        self.result = {char: 0 for char in TURKISH_ALPHABET}
        with open(self.file) as f:
            while True:
                char = f.read(1)
                if char in TURKISH_ALPHABET:
                    self.result[char] += 1
                elif char == '':
                    break

nygma = Frequance('test.txt')

Şu şekilde modifiye ettim. Ama bu sefer de dosyayı sonsuza dek okuyor. elif kısmı br işe yaramıyor.

from pprint import pprint

alfabe = list("abcçdefgğhıiklmnoöprsştuüvyz")
sözlük = {}
with open("test.txt","r",encoding="utf-8") as f:
    oku = f.read().lower()
    for harf in oku:
        if harf in alfabe:
            sözlük.update({harf : oku.count(harf)})
pprint(sözlük)

Şu bence güzel bir örnek gibi duruyor yazdığınız koda uyarladığınızda güzel bir sonuç alırsınız gibi.

test.txt: (Saçma bir cümle kurdum)
Merhaba bu dosya metin belgesi dosyasıdır.
Değişime açık düzenlenebilir ve yapılan değişiklikler kayıt edilebilir. 
Uyarlandığında
from pprint import pprint

TURKISH_ALPHABET = list("abcçdefgğhıiklmnoöprsştuüvyz")
class Frequance():
    def __init__(self, file,mode) -> str:
        self.file = file
        self.mode = mode
        sözlük = {}
        with open(self.file,self.mode,encoding="utf-8") as f:
            oku = f.read().lower()
        for harf in oku:
            if harf in TURKISH_ALPHABET:
                sözlük.update({harf : oku.count(harf)})
        pprint(sözlük)
nygma = Frequance(file="test.txt",mode="r")
Çıktı
{'a': 8,
 'b': 5,
 'd': 6,
 'e': 14,
 'g': 1,
 'h': 1,
 'i': 12,
 'k': 4,
 'l': 8,
 'm': 2,
 'n': 4,
 'o': 2,
 'p': 1,
 'r': 5,
 's': 4,
 't': 2,
 'u': 1,
 'v': 1,
 'y': 4,
 'z': 1,
 'ç': 1,
 'ü': 1,
 'ğ': 2,
 'ı': 5,
 'ş': 2}

bu modül ne işe yarar, normal print fonksiyonu ile farkı nedir

Çıktıyı ekranda daha okunabilir kılıyor örneğin yazdığım kodu normal print fonksiyonu ile yazın. Ardından bu modülü dahil ederek yazın farkı göreceksiniz. (kişisel zevk açısından kullandım :slight_smile: )

print('' in TURKISH_ALPHABET)

pprint farkını gördüm evet sonucu for döngüsüyle oluşturmuş gibi yazıyor.

Belleğe fazla veri yüklememesi için bu yöntemi uygulamak istemiyorum. Veri on binlerce karakterden oluşuyor olabilir. Böyle bir durumda hepsinin okunup belleğe kaydedilmesi gerekiyor.

Anlıyorum, yani karakter dizesinde None karakteri de mevcut. Sorunu şu şekilde çözdüm:

TURKISH_ALPHABET = tuple("abcçdefgğhıiklmnoöprsştuüvyzABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ")
1 Beğeni

None degil, bos str. Dizide mevcutluk kontrolu yapmiyoruz, “bu str diger str’nin icinde geciyor mu” kontrolu yapiyoruz. Ve bos str icin True olarak tanimlanmis.

Cozumdeki tuple "dizi"ye daha yakin bir kavram. Tek uzunluktaki str’lerden (karakterlerden) olusan bir dizi. in daha farkli (ve bu noktada, istedigimiz gibi) calisiyor.

2 Beğeni