10.2. Dosya işlemleri I/O

Programlama dillerinde sabit diske veri yazmak ve veriyi okumak verilerimizin kalıcı açısından önemlidir. Her ne kadar günümüzde veritabanına yazma/okuma ve hatta bulut üzerinde yazma/okuma popüler olsa da standart dosya işlemleri de en temel veri saklama yöntemidir. Python, dosyaları değiştirmek için gerekli temel fonksiyonları ve yöntemleri sağlar. Bir dosya nesnesini kullanarak dosya işlemlerin çoğunu yapabilirsiniz. C programlama dilindeki dosya işlemlerine çok benzer metotlar içerir.

10.2.1. Dosya açma: open()

Bir dosyayı okuyabilmeniz veya yazabilmeniz için önce Python’un open() fonksiyonunu kullanarak açmanız gerekir. Bu fonksiyon, onunla ilişkili diğer destek yöntemlerini çağırmak için kullanılabilecek bir dosya (file) nesnesi oluşturur. Sözdizimi:

file object = open(Dosya_ismi [, Erişim_modu][, Buffer])

Parametre açıklamaları:

  • Dosya_ismi: Bu argüman dosyanın yolunu ve adını içeren bir katardır. Kullanılması zorunludur.
  • Erişim_modu: Dosyanın açılması gereken modu (okuma, yazma, ekleme, vb.) belirler. Bu isteğe balı seçimlik bir argümandır. Eğer bu argüman girilmezse dosya erişim modu okunur “r” olarak ayarlanır.
  • Buffer: Ara bellek okuma veya yazma sırasında ne kadar arabelleğin kullanılacağın belirlenmesi için kullanılan seçimlik bir argümandır. Eğer bu değer 0 (sıfır) olarak ayarlanırsa arabelleğe alma işlemi gerçekleşmez. Eğer 1 (bir) olursa satır satır işlem yapılır. Eğer bu değer birden büyükse belirtilen değer kadar arabellek kullanılır. Eğer değer negatifse veya bu argüman girilmediyse, arabellek boyutu varsayılan değer olarak kullanılır.
Mod Tanımı
r Sadece okumak için bir dosya açar. Dosya işaretçisi, dosyanın başına yerleştirilir. Bu varsayılan moddur.
rb Sadece ikili formatta okumak için bir dosya açar. Bu varsayılan moddur.
r+ Hem okuma hem de yazma için bir dosya açar.
rb+ İkili biçimde okuma ve yazma için bir dosya açar.
w Sadece yazmak için bir dosya açar. Dosya varsa, dosyanın üzerine yazar. Dosya yoksa, yazmak için yeni bir dosya oluşturur.
wb Sadece ikili formatta yazmak için bir dosya açar. Dosya varsa, dosyanın üzerine yazar. Dosya yoksa, yazmak için yeni bir dosya oluşturur.
w+ Yazma ve okuma için bir dosya açar. Dosya mevcutsa mevcut dosyanın üzerine yazar. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.
wb+ İkili biçimde hem yazma hem de okuma için bir dosya açar. Dosya mevcutsa mevcut dosyanın üzerine yazar. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.
a Eklemek için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya mevcut değilse, yazmak için yeni bir dosya oluşturur.
ab İkili biçimde eklemek için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya mevcut değilse, yazmak için yeni bir dosya oluşturur.
a+ Hem ekleme hem de okuma için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya mevcut değilse, okuma ve yazma için yeni bir dosya oluşturur.
ab+ İkili biçimde hem ekleme hem okuma için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya mevcut değilse, okuma ve yazma için yeni bir dosya oluşturur.

10.2.2. Dosya nesnesi özellikleri

Bir dosya açıldıktan sonra bir dosya nesnesi oluştuğu belirtmiştik. Bu dosyanın ulaşabileceğimiz temel özellikleri dosya nesnesi oluştuktan sonra ulaşılabilir hale gelir.

Özellik Tanımı
file.closed Dosya kapatıysa true döner, aksi halde false döndürür.
file.mode Dosyanın hangi modda açıldığını döndürür.
file.name Dosya yolu ve ismi döndürür.

10.2.3. Dosya nesnesini kapatma: close()

Bir dosya nesnesinin close () metodu dosya nesnesini kapatır bundan sonra daha fazla yazma veya okuma işlemi yapılamaz. close() metodu çağrıldığı anda yapılan bir işlem varsa sonlandırılır. Bir dosyanın referans nesnesi başka bir dosyaya yeniden atandığında, Python otomatik olarak bir dosyayı kapatır. Ancak, bir dosyayı kapatmak için close () yöntemini kullanmak tercih edilmesi gereken bir tekniktir.

fileObject.close()

10.2.3. Dosya veri yazma ve okuma

Dosya nesnesindeki read() ve write() metotlarını kullanarak okuma ve yazma işlemi kolayca yapılabilir.

10.2.3.1. write() metodu

write() metodu, herhangi bir katarı (bir metin veya binary bir veri olabilir) açık bir dosyaya yazar. write() yöntemi yeni satır açmadığı için ‘\n’ ile yeni satır açılabilir. Sözdizimi:

fileObject.write(string)

Dosyadan oluşan çıktıyı dikkatli bir şekilde inceleyelim.

10.2.3.2. read() metodu

read() metodu, açık bir dosyadan bir string (metin veya binary) okur. Sözdizimi:

fileObject.read([count])

Count parametresi açılan dosyadan okunacak bayt sayısıdır. Bu yöntem dosyanın başlangıcından itibaren okumaya başlar. Eğer count değeri yoksa sonuna kadar okumaya çalışır. Örneğin,

Her okuma işleminde sonra kaldığı yerden devam eder. Kalanların tümünü okumak için (son okuma işleminde) read() metodu parametre kullanmadan çağrılmıştır.

10.2.3. Dosya pozisyonları

Bir önceki örnekte read() metodu ile okuma yaparken son kaldığı pozisyondan devam ettiğini söylemiştik. Bu pozisyon bilgisini bulmak için tell() metodu kullanılır. Başka bir deyişle okuma veya yazma işleminin dosyanın başlangıcından itibaren kaç bayt gerçekleştiğini bildirir. seek(ofset [,from]) yöntemi geçerli dosya pozisyonu değiştirmek için kullanılır. Ofset argümanı taşınacak bayt sayısını gösterir. Seçimlik olan from parametresi ise baytların taşınacağı referans konumunu belirler. 0(sıfır) olarak belirlenirse dosyanın başlangıcından başlar, 1(bir) mevcut pozisyonu kullanır ve 2 (iki) ise dosyanın sonu referans pozisyonu olarak ayarlanır.

10.2.4. with kullanımı

close fonksiyonunu her seferinde çağırmayı unutabiliriz. Python bu durumları göz önüne alarak with deyimini önermiştir. Kullanımı:

Dosyayı yazma modunda açtıktan sonra dosya üzerine yazma yapıldı ve close kullanılmadı.

Bir soru bir klasörünüz olsun. Kaç dosya varsa dosya numarası verip kaydeden bir Python kodu yazın. Örneğin, 3 dosya varsa 003.txt, 004.txt vs… veya hiç dosya yoksa 001.txt, 002.txt, 003.txt vs…

Bildiğiniz hangi konularını kullanılırsın. Google kullanmak serbest…