2.27. Okuma ve yazma

Dosyalar diskte yaşar; Python onlara, altta yatan baytları okuyan ve yazan yöntemlere sahip bir dosya nesnesi döndüren open() aracılığıyla ulaşır.

2.27.1. open ve modlar

İlk argüman yoldur; ikincisi mod‘dur – Python’a dosyanın nasıl kullanılacağını söyleyen kısa bir dize:

  • "r" – okuma (varsayılan). Var olan bir dosyayı okumak için açar.

  • "w" – yazma. Yeni bir dosya oluşturur veya var olan birini boş olacak şekilde kırpar.

  • "a" – ekleme. Bir dosyayı, kırpmadan sonuna yazmak için açar.

  • Yukarıdakilerden herhangi birine eklenen "b" ("rb", "wb", "ab") – ikili mod. Dosyanın içeriği str yerine bytes olur.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Bir bağlam yöneticisi kullanın

Yukarıdaki desen, open() ile close arasındaki herhangi bir şey yükseltirse dosya tutamacını sızdırır. Düzeltme, with ifadesidir (bkz. bağlam yöneticileri):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

Bu standart biçimdir – her seferinde bu şekilde yazın.

2.27.3. Okuma

Dosya nesneleri birkaç okuma stilini destekler:

  • io.IOBase.read() – tüm dosyayı (veya N bayt) okur ve onu tek bir dize (veya bytes nesnesi) olarak döndürür.

  • io.IOBase.readline() – sondaki "\n" dahil olmak üzere bir satır okur.

  • Dosyayı doğrudan yinelemek, satırları teker teker verir ve bu, tüm dosyayı bir kerede okumaktan çok daha az bellek kullanımı sağlar.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip(), çıktının çift satır aralıklı olmaması için yazdırmadan önce sondaki yeni satırı kaldırır.

2.27.4. Yazma

Dosyayı "w" modunda açın ve io.IOBase.write() kullanın:

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() bir yeni satır eklemez – ona verdiğiniz tam baytları (veya metin modunda karakterleri) yazar.

2.27.5. Metin ve ikili

Metin modu (varsayılan, "b" olmadan "r" / "w"), gelen baytları varsayılan bir kodlama kullanarak str‘ye çözer ve giden str‘yi tekrar baytlara kodlar. Onu yapılandırma, günlükler, JSON – metin olan her şey için kullanın.

İkili mod ("rb" / "wb"), kod çözme adımını atlar ve bytes döndürür. Onu görüntüler, struct ile paketlenmiş kayıtlar, ağ yakalamaları – her baytın önemli olduğu ve dosyanın insan tarafından okunamadığı her şey için kullanın.

2.27.6. Dosyaları listeleme ve kaldırma

os modülü, dosya nesnesinin kendisinde bulunmayan dosya sistemi işlemlerini açığa çıkarır:

import os

for name in os.listdir("/"):
    print(name)

Dosya veya dizin orada olmayabileceğinde bunların etrafında OSError‘u yakalayın – bu işlem, gerçek betiklerde istisnaların ortaya çıktığı yaygın yerlerden biridir.