10 Aralık 2014 Çarşamba

Numpy: Veri Dosyaları


Python programındaki anlık veriler fiziksel bellek üzerinde depolanır ve program sonlandırıldığında kaybolur. Bu yüzden verileri kalıcı hale getirmek ve daha önceden kaydedilmiş veri blokları programımızda kullanmak için dosyadan veri alışverişi yapma ihtiyacı duyarız. Veri dosya içerisinde yazılı metin olarak durduğundan biçimi, verinin nasıl okunup yazılmasını gerektiğini belirler. Bu bölümde Numpy kütüphanesinin dosya işlemleri için bize sunduğu fonksiyonlarıyla düzenli dosya okuyup yazmanın nasıl yapıldığını göreceğiz.

Hızlı okuyup yazma
Dizileri dosyaya yazdırmanın en basit yolu tofile komutunu kullanmaktır. Bu fonksiyon fiziksel hafızada depolandığı biçimiyle yani ikili(binary) olarak diziyi kaydeder. Bu yöntem hızlı olsa da veri dosyalarının taşınabilir olması istenen durumlar için tavsiye edilmez çünkü kayıt formatı mevcut donanıma ve işletim sistemine bağlıdır. Kaydedilen ikili dosyalar fromfile komutu ile okunabilir. 
>>> from numpy import *                      # Numpy kütühanesini ekliyoruz
>>> dizi = ndarray(shape(2,2), dtype='int')  # 2x2'li dizi oluşturup değer atıyoruz
>>> dizi[0,0] = 1; dizi[0,1] = 2; dizi[1,0] = 3; dizi[1,1] = 4;
>>> print(dizi)
[[1, 2]
[3, 4]]
>>> dizi.tofile('dizi.dat')
>>> dizi_kopya = fromfile('dizi.dat', dtype='int')
>>> print(dizi_kopya)
[1, 2, 3, 4]
dizi.dat dosyasını açmaya çalıştınızda ascii karakterlerden oluştuğunu göreceksiniz. Dosya ikili formatta olduğu için yalnızca yine Python kodu tarafından açılıp okunabilir. Ayrıca görüldüğü gibi dizimizin şekli korumayıp geri alındığında tek boyutlu dizi olarak elde edilmektedir. Bu sebeplerden ötürü kalıcı dosya kayıtları için yukarıda bu tip dosya okuyup yazma tercih edilmemektedir. Yerine daha işlevsel olan savetxt, loadtxt komutları kullanılır.

Metin biçiminde okuyup yazma
Metin veri dosyası istenilen biçimde şekillendirilebilir. Örneğin; birçok ölçüm cihazının yazılım arayüzü ölçüm değerlerini kaydettiği dosyada öncelikle ölçüme ait ortam parametrelerini verir ve ardından sütunlar halinde sonuçları sıralar. Başka bir örnek de HDF gibi yapısal veri dosya biçimleridir. Bu dosyalarda veri ait olduğu nesnenin sınıfın altında verilir. Benzer birçok örnek de verilebilir. İşte bu sebepten ötürü yazılımcılar genellikle farklı biçimleri de sorunsuzca okuyup yazmaya imkan tanıyacak fonksiyonlar ararlar. Python programlama dili, Numpy kütüphanesi sayesinde bize oldukça işlevsel olan loadtxt, savetxt komutlarını bize sunar.  İki komut benzer yapıda olup, adından da anlaşılacağı üzere biri dosyaya kaydetmeyi, diğeri de dosyadan veri okumayı sağlar. Öncelikle bir örnekle dizimizi farklı biçimlerde nasıl dosyaya yazdırabildiğimizi görelim ardından da bu dosyalardaki verileri okumaya çalışalım.
>>> dizi = random.radom(6)          # 6'lık dizi oluşturup rastgele değer atıyoruz
>>> matris = reshape(dizi, (3,2))   # diziyi matris biçiminde şekillendiriyoruz
>>> print(matris)                   # matrisi ekrana yazdırıyoruz
[[ 0.71822401, 0.59663587]
 [ 0.5858213 , 0.12121402]
 [ 0.32291168, 0.32205304]]
>>> # herbir iki sütun da farklı formatta olacak biçimde dosyaya yazdırıyoruz.
>>> savetxt('matris.txt', matris, fmt=['%.2','%.5f'], delimiter=',', newline='\n',\
... header='Dizi yazdiriliyor...', footer='Dizi yazdirildi.', comment='#')
Görüldüğü gibi tek bir komutla veri dosyamızdaki sütünların formatını belirleyip yorum satırları da ekleyerek yazdırabiliyoruz. Buradaki fmt veri sütunlarının formatını, delimiter sütunların hangi karakterle birbirinden ayrılacağını, newline satırların hangi karakterle ayrılacağını, header ve footer sırasıyla alt ve üst yorum cümlelerini, comment yorum cümlelerinin hangi karakterle başlayacağını belirtir. Şimdi dosyamız içindeki verilerin nasıl göründüğünü bakalım.
# Dizi yazdiriliyor...
0.72,0.59664
0.59,0.12121
0.32,0.32205
# Dizi yazdirildi.
Dosyamızı yazdırdıktan sonra benzer şekilde loadtxt komutu ile verileri otomatik olarak dizi nesnesine aktarabiliriz. Sadece değerler diziye aktarılacağı için yorum cümleleri göz ardı edilir.
>>> # matrisi geri al
>>> matris = loadtxt('matris.txt', dtype='float', comments='#', delimiter=',')
>>> print(matris)
[[0.72 0.59664]
 [0.59 0.12121]
 [0.32 0.32205]]
>>> # ilk iki sütunu ayrı ayrı dizilere al
>>> s1, s2 = loadtxt('matris.txt', dtype='float', comments='#', delimiter=','\
... usecols=(0,1), unpack=True) )
>>> print(s1)
[0.72 0.59 0.32]
>>> print(s2)
[0.59664 0.12121 0.32205]
Görüldüğü gibi Numpy kütüphanesinin sunduğu fonksiyonlar sayesinde verilerimizi; standart dosya açma, kapama işlemlerine ve döngü ile değerleri teker transfer etmeye gerek kalmadan kolayca okuyup yazabiliriz.

0 yorum :

Yorum Gönder