Temel dosya işlemleri hakkında

Herkese merhaba. Python öğrenmek için çalışmakta olduğum bir kitabın “Cümleler ve Dosyalar” konu başlıklı ünitesinin bir probleminde takılmış bulunuyorum.

Probleme göre, elimde şöyle bir otobüs oturma düzeni var:

** **
** **
** **
** **
** **
** **

Bu bir koltuk düzeni ve bu düzen aynen bu şekilde bir txt dosyasından okunacak. Yıldızlar koltuk, boşluklar ise koridor. Koltuklar soldan sağa numaralandırılıyor. Problemin istediği ise kısaca şöyle, programı açıp yolcudan bir koltuk numarası istiyorum. Yolcunun girdiği numara eğer müsaitse o numaraya denk gelen * işaretini x ile değiştirip dosyaya yazdırıyorum.

Problemle alakalı şöyle bir çalışma yaptım ama çalışmıyor. Çözümle alakalı ipucu verebilirseniz minnettar kalırım.

with open("Otobüs.txt","r+") as f:
    koltuklar=f.read()
    koltuk_no=[]
    for i in koltuklar:
        if i == "*":
            koltuk_no.append("*")
    f.truncate(0)
    while 1:
        istenen = input("Hangi koltuğu ayırmak istersiniz? ")
        if istenen.isnumeric():
            if koltuk_no[(int(istenen))+1]=="*":
                koltuk_no[(int(istenen))+1]="x"
                print("Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.")
                for j in range(20):
                    f.write(str(koltuk_no)[j]+(str(koltuk_no)[j+1]+" "))
                    f.write(str(koltuk_no)[j+2] + (str(koltuk_no)[j + 3]))
                    f.write("\n")
            else:
                print("Ayırmak istediğiniz koltuk dolu! Lütfen başka bir numara tercih ediniz.")
        else:
            print("Lütfen yalnızca sayı giriniz!")
import numpy as np
while True:    
    
    bus=open("denek.txt","r+")
    o_b=bus.read()
    no=int(input("Koltuk Numarası :"+"\n"))-1
    kalan=no//2
    no=no+kalan
   
    a=np.array(list(o_b))
    if a[no]=="*":
        
        print("Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.")
        a[no]="x"
        np.savetxt("denek.txt", a, newline="",fmt='%s')
    else:
        print("Ayırmak istediğiniz koltuk dolu! Lütfen başka bir numara tercih ediniz.")
        continue

nasıl indexlemen gerektiğini bu koddan yolarak çıkarak yapabilirsin ve numpy kullanmadan tekrardan yazarsın

Bu manasiz, “1 oldugu surece” ne demek?

Dosyaya yazdigin veriye baktin mi? Formati bozuluyor.

daha detayli

write cagrisina arguman olarak yolladigin str’lere bak

daha da detayli

koltuk_no’nun ilgili elemanini almak yerine str’ye cevrilmis halinin ilgili karakterini aliyorsun.

j’de de sikinti var

Programin yaptigi islemleri satir satir kontrol etmen lazim. Debugger’in yoksa her satira “simdi X degeri ile Y yapiyorum” gibi print’ler ekleyebilirsin.

1 Beğeni

Kodlar:

# Dosyadan okunan veride, numarası verilen koltuğun
# indeks numarasını bulmak için bir fonksiyon oluşturalım.
def indeks_bul(yazi, harfler, numara):
    toplam = 0
    for i in range(len(yazi)):
        if yazi[i] in harfler:
            toplam += 1
        if toplam == numara:
            return i
          
with open("Otobüs.txt", "r+") as dosya:
    koltuklar = dosya.read()
    while True:
        numara = input("Ayırmak istediğiniz koltuk numarasını giriniz: ")
        if numara.isnumeric() is True:
            # Verilen koltuk numarasının hangi indekste yer aldığını bulalım.
            indeks = indeks_bul(koltuklar, ("*", "x"), int(numara))
            if koltuklar[indeks] == "*":
                # Numarası verilen koltuğu "x" ile değiştirelim.
                koltuklar = koltuklar[:indeks] + "x" + koltuklar[indeks+1:]
                print("Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.")
                print(koltuklar)
                dosya.write(f"\n{koltuklar}\n")
            else:
                print("Ayırmak istediğiniz koltuk dolu! Lütfen başka bir numara tercih ediniz.")
        else:
            print("Lütfen yalnızca sayı giriniz!")

Çıktı:

Ayırmak istediğiniz koltuk numarasını giriniz: 1
Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.
x* **
** **
** **
** **
** **
** **

Ayırmak istediğiniz koltuk numarasını giriniz: 2
Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.
xx **
** **
** **
** **
** **
** **

Ayırmak istediğiniz koltuk numarasını giriniz: 10
Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.
xx **
** **
*x **
** **
** **
** **

Ayırmak istediğiniz koltuk numarasını giriniz: 2
Ayırmak istediğiniz koltuk dolu! Lütfen başka bir numara tercih ediniz.
Ayırmak istediğiniz koltuk numarasını giriniz: 23
Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.
xx **
** **
*x **
** **
** **
** x*

Dosya:

** **
** **
** **
** **
** **
** **

x* **
** **
** **
** **
** **
** **


xx **
** **
** **
** **
** **
** **


xx **
** **
*x **
** **
** **
** **


xx **
** **
*x **
** **
** **
** x*

Edit: “r+” olmasına rağmen neden “a” gibi ekleme yaptı ki? :thinking:

2 Beğeni

Öncelikle emeğiniz için çok ama çok teşekkür ederim. Sanırım problemin çözümüne en yakın kod sizin yazdığınız. Ancak şöyle bir sorun var, elde ettiğimiz son oturma düzenini programa sıfırdan yazmamız gerekiyor. Acaba ilk işlemleri “r+” ile yapıp yazdırma işlemini “w” kipiyle yazsak sorun düzelir mi? Çünkü programı kapatıp açtığımızda dosya içerisinde yine 24 koltuk olmalı. Program kapatılıp açıldığında sizin dosyanız sorun yaratacaktır. Yardımcı olduğunuz için tekrardan teşekkür ederim (:

1 Beğeni

Şu şekilde oldu sanırım,

# Dosyadan okunan veride, numarası verilen koltuğun
# indeks numarasını bulmak için bir fonksiyon oluşturalım.
def indeks_bul(yazi, harfler, numara):
    toplam = 0
    for i in range(len(yazi)):
        if yazi[i] in harfler:
            toplam += 1
        if toplam == numara:
            return i
          
with open("Otobüs.txt", "r") as dosya:
    koltuklar = dosya.read()

while True:
    numara = input("Ayırmak istediğiniz koltuk numarasını giriniz: ")
    if numara.isnumeric() is True:
        # Verilen koltuk numarasının hangi indekste yer aldığını bulalım.
        indeks = indeks_bul(koltuklar, ("*", "x"), int(numara))
        if koltuklar[indeks] == "*":
            # Numarası verilen koltuğu "x" ile değiştirelim.
            koltuklar = koltuklar[:indeks] + "x" + koltuklar[indeks+1:]
            print("Koltuğunuz rezerve edilmiştir. İyi yolculuklar dileriz.")
            print(koltuklar)
            with open("Otobüs.txt", "w") as dosya:
                dosya.write(koltuklar)
        else:
            print("Ayırmak istediğiniz koltuk dolu! Lütfen başka bir numara tercih ediniz.")
    else:
        print("Lütfen yalnızca sayı giriniz!")
1 Beğeni

Seninki daha yakin da… Ipucu istememis miydin? :

Odevle ilgili yardim istiyorsan direk soyleyebilirsin. Dogrudan cevabi yazmak pek hoslandigimiz bir davranis degil fakat isguzar arkadaslarin bunu yapmasini engellemiyoruz.

1 Beğeni

Merhaba,

Bu bir ödev değil. Ben öğrenmek için çalışıyorum, sorunun çözümünü bir yerlere teslim etmeyeceğim.
Sizin verdiğiniz ipuçları için de çok teşekkür ederim. Kendi yazdığım kod üzerinde write() yerine writelines() kullanarak ve str ibarelerini kaldırarak o kısmı halletim sanırım. j üzerinde düşünmeye devam ediyorum şimdilik.

Dosyanın tamamı okunduğu için imleç de dosyanın sonunda oluyor.

1 Beğeni