Dosya Okuma ve Yazma
Önceki Giriş ve Çıkış Sonraki
Dosya Okuma ve Yazma
open() işlevi bir dosya nesnesi geri döndürür ve genellikle iki argüman ile kullanılır: open(dosya_adı, kip)
>>> f=open('/tmp/workfile', 'w')
>>> print f
<open file '/tmp/workfile', mode 'w' at 80a0960>
İlk argüman dosya adını içeren bir dizgedir. İkincisi ise dosyanın nasıl kullanılacağını belirten karakterlerden oluşur. Erişim kipi dosyadan sadece okuma yapılacak ise 'r', sadece yazma için 'w' (aynı isimli bir dosya zaten var ise üzerine yazılır) ve dosyanın sonuna eklemeler yapmak için 'a' olur. 'r+' kipi dosyayı hem okuma hem de yazma yapmak için açar. kip argümanı seçimliktir; kullanılamaması halinde 'r' olduğu varsayılır.
Windows ve Macintosh üzerinde kipe eklenen 'b' harfi dosyayı ikilik kipte açar; yani 'rb', 'wb' ve 'r+b' gibi kipler de vardır. Windows metin ve ikilik dosyaları arasında ayrım yapmaktadır; metin dosyalarında okuma veya yazma işlemlerinde satır sonu karakterleri otomatik olarak biraz değişir. Bu görünmez değişiklik ASCII metin dosyaları için iyidir; anacak JPEG resimler veya .EXE dosyalar gibi iklik verileri bozar.
Dosya Nesnelerinin Yöntemleri
Bundan sonraki örneklerde f adlı bir dosya nesnesinin önceden oluşturulmuş olduğunu varsayacağız.
Dosyanın içeriğini okumak için belirli miktarda veriyi okuyup bunu dizge olarak geri döndüren f.read(boy)yöntemi kullanılabilir. boy okunacak bayt sayısını belirleyen seçimlik bir argümandır; kullanılmaması halinde dosyanın tamamı okunur. Dosyanın sonuna gelindiğinde f.read() boş bir dizge ("") geri döndürür.
>>> f.read()
'Dosyanın tamamı bu satırdan oluşuyor.\n'
>>> f.read()
''
f.readline() dosyadan tek bir satır okur. Satırın sonundaki satırsonu karakteri (\n) korunur; ancak dosya bir satırsonu karakteri ile bitmiyor ise son satırda bu karakter silinir. Bu özellik geri döndürülen değerin birden fazla anlama gelmesini engeller; f.readline() boş bir dizge geri döndürdüğünde dosyanın sonuna ulaşılırken boş bir satır tek bir '\n' karakteri ile ifade edilir.
>>> f.readline()
'Bu dosyanın ilk satırı.\n'
>>> f.readline()
'Dosyanın ikinci satırı\n'
>>> f.readline()
''
f.readlines() dosya içindeki bütün satırların bulunduğu bir liste geri döndürür. Seçimlik parametre boy_ipucu kullanılması durumunda ise dosyadan boy_ipucu kadar ve bundan bir satır tamamlamaya yetecek kadar fazla bayt okunur ve bunlar yine satırlar listesi şeklinde geri döndürülür.
>>> f.readlines()
['Bu dosyanın ilk satırı.\n', 'Dosyanın ikinci satırı\n']
f.write(dizge) yöntemi dizge içeriğini dosyaya yazar ve None geri döndürür.
>>> f.write('Bu bir deneme satırıdır.\n')
f.tell() dosya nesnesinin dosya içindeki konumunu belirten bir tamsayı geri döndürür (dosyanın başından bayt cinsinden ölçülür). f.seek(uzaklık, nereden) ile de dosyanın içinde istenen konuma gidilebilir. Konum, uzaklık ile başvuru noktası nereden değerlerinin toplanması ile bulunur. nereden 0 olursa dosyanın başını, 1 o andaki konumu, 2 ise dosyanın sonunu belirtir. nereden kullanılmaz ise 0 olduğu varsayılır ve başvuru noktası olarak dosyanın başı alınır.
>>> f=open('/tmp/workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5)     # Dosyadaki 5'inci bayta git
>>> f.read(1)
'5'
>>> f.seek(-3, 2) # Sondan 3'üncü bayta git
>>> f.read(1)
'd'
Dosya ile işiniz bittiğinde f.close() yöntemini çağırarak dosyayı kapatabilir ve dosyanın işgal ettiği sistem kaynaklarını serbest bırakabilirsiziz. f.close() çağrıldıktan sonra dosya üzerinde başka işlem yapmaya devam etmek mümkün değildir:
>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
Dosya nesnelerinin isatty() ve truncate() gibi pek sık kullanılmayan başka yöntemleri de vardır.
pickle Modülü
Dizgeler kolayca dosyalara yazılıp dosyalardan okunabilirler. Sayılar biraz zahmetlidir; çünkü read() yöntemi sadece dizgeleri geri döndürür ve bunların '123' gibi bir değeri alıp sayısal değeri 123'ü geri döndüren string.atoi() işlevinden geçirilmeleri gerekir. Listeler, sözlükler ve sınıf gerçeklemeleri (class instances) gibi daha karmaşık veri türlerini dosyalara kaydetmek isterseniz işler oldukça zorlaşır.
Programcıları karmaşık veri türlerini saklamak için kodlamak ve hata ayıklamak ile uğraştırmak yerine Python bu iş için pickle adlı standart modülü sağlar. Bu hayret verici modül neredeyse herhangi bir Python nesnesini (bazı Python kodu biçimlerini bile!) dizge ile ifade edilebilecek hale getirebilir ve bu halinden geri alabilir. Bu dönüşüm ve geri kazanım işlemleri arasında nesne bir dosyaya kaydedilebilir ya da ağ bağlantısı ile uzaktaki başka bir makineye gönderilebilir.
x gibi bir nesneniz ve yazma işlemi için açılmış f gibi bir dosya nesneniz varsa bu nesneyi dosyaya aktarmanız için tek satırlık kod yeterli olur:
pickle.dump(x, f)
Nesneyi geri almak için ise f okumak için açılmış bir dosya nesnesi olsun:
x = pickle.load(f)
Birden fazla nesnenin dönüştürülmesi gerekiyor ya da dönüştürülmüş olan nesnelerin dosyaya yazılması istenmiyor ise pickle farklı şekilde kullanılır. Bunları pickle modülünün belgelerinden öğrenmek mümkündür.
pickle modülü saklanabilen ve başka programlar tarafından ya da aynı programın farklı çalışma zamanlarında kullanılabilecek Python nesneleri yapmanın standart yoludur. pickle modülü çok yaygın kullanıldığından Python genişletme modülleri yazan çoğu programcı matrisler gibi yeni veri türlerinin doğru olarak dönüştürülebilir ve geri alınabilir olmasına özen gösterirler.
Önceki Üst Ana Başlık Sonraki
Daha Güzel Çıkış Biçemi Başlangıç Hatalar ve İstisnalar
Bir Linux Kitaplığı Sayfası