Garfield
YZF Admin
Temel kullanım
numpy.fromfile(), dosyadaki verileri NumPy dizisine aktarır. İkili bir dosya okuyorsanız veri türünü (dtype) dosyanın yazıldığı türle aynı belirtin; metin dosyasında ise sep parametresini kullanın. Böylece okuma sonunda sayısal değerlerden oluşan bir ndarray elde edersiniz.Ön koşul olarak NumPy kurulu olmalıdır. Aşağıdaki örnek, varsayımsal olarak
sayilar.bin dosyasının 64 bit kayan noktalı değerler içerdiğini kabul eder:
Python:
import numpy as np
veriler = np.fromfile("sayilar.bin", dtype=np.float64)
print(veriler)
print(veriler.dtype)
print(veriler.shape)
Dosya sırasıyla
1.5, 2.75 ve 10.0 değerlerini içeriyorsa beklenen çıktı yaklaşık olarak şöyledir:
Kod:
[ 1.5 2.75 10. ]
float64
(3,)
Buradaki
(3,), dizinin tek boyutlu ve üç elemanlı olduğunu gösterir. Bu sonuç dosyanın gerçekten doğru biçimde yazıldığını tek başına kanıtlamaz; yanlış dtype seçilirse aynı baytlar bambaşka sayılar olarak yorumlanabilir.İkili ve metin dosyası arasındaki fark
fromfile hem ikili hem de metin veri okuyabilir; hangi yöntemin kullanılacağı dosyanın fiziksel biçimine bağlıdır. İkili dosyada sep boş bırakılır veya varsayılan değerde tutulur. Metin dosyasında ayraç belirtilir.| Dosya biçimi | Temel kullanım | Dikkat edilmesi gereken |
|---|---|---|
| İkili | np.fromfile("veri.bin", dtype=np.float32) | dtype, dosyanın yazıldığı türle aynı olmalıdır. |
| Metin | np.fromfile("veri.txt", dtype=float, sep=" ") | sep, dosyadaki ayraçla eşleşmelidir. |
veri.txt içinde şu metin varsa:
Kod:
10.5 20.25 30.0
şu kod sayıları okur:
Python:
import numpy as np
veriler = np.fromfile("veri.txt", dtype=float, sep=" ")
print(veriler)
Beklenen çıktı
[10.5 20.25 30. ] benzeri bir dizidir. Satırlar arasında değişken boşluklar varsa sep=" " genel boşluk ayırıcılarını ele alabilir. Virgülle ayrılmış bir metin için sep=", " veya dosyanın gerçek biçimine uygun başka bir ayraç kullanın.Okumayı sınırlandırma ve şekil verme
Büyük bir dosyanın tamamını almak yerine belirli sayıda eleman okuyabilirsiniz.
count okunacak eleman sayısını, offset ise ikili dosyada başlangıçta atlanacak bayt sayısını belirtir:
Python:
import numpy as np
ilk_on = np.fromfile("sayilar.bin", dtype=np.float64, count=10)
sonraki_on = np.fromfile(
"sayilar.bin",
dtype=np.float64,
count=10,
offset=10 * np.dtype(np.float64).itemsize
)
İkinci okumada ilk 10 adet
float64 değerin kapladığı baytlar atlanır ve sonraki 10 değer alınır. offset değeri eleman sayısı değil, bayt sayısıdır. Yanlış hesaplanırsa veri elemanının ortasından başlanabilir ve anlamsız sonuçlar elde edilebilir.Dosyada toplam 12 adet değer bulunduğunu biliyorsanız okuma sonrasında diziyi iki boyutlu hâle getirebilirsiniz:
Python:
veriler = np.fromfile("sayilar.bin", dtype=np.float64)
if veriler.size != 12:
raise ValueError(f"12 değer bekleniyordu, {veriler.size} değer okundu.")
matris = veriler.reshape(3, 4)
print(matris)
reshape(3, 4) işlemi 12 elemanı 3 satır ve 4 sütun olarak düzenler. Eleman sayısı 12 değilse şekillendirme yapılamaz; bu nedenle önce size ile kontrol etmek hatayı daha anlaşılır hâle getirir.Yaygın hataları ayırma
Dosya bulunamıyorsa Python genellikle
FileNotFoundError üretir. Dosya yolunu ve programın çalıştığı geçerli klasörü kontrol edin; göreli yol, betiğin bulunduğu klasörle her zaman aynı olmayabilir.Sonuçta çok büyük veya anlamsız sayılar görülüyorsa önce
dtype değerini kontrol edin. Veriyi yazan program float32 kullandıysa okurken float64 seçmek baytların gruplanmasını değiştirir. Benzer şekilde işaretli ve işaretsiz tamsayı türleri de aynı bitleri farklı yorumlar.Metin dosyasında hiç veri okunmuyorsa
sep değerinin dosyadaki ayraçla aynı olduğundan emin olun. İkili dosyada sep vermek yerine doğru dtype kullanılmalıdır.Dosya biçimi bilinmiyorsa
fromfile dosyanın veri türünü, boyutunu veya byte sırasını kendiliğinden güvenilir biçimde keşfetmez. Okumadan önce veriyi üreten programın kullandığı dtype, eleman sayısı, bayt sırası ve varsa başlık yapısı bilinmelidir. Dosyada başlık bilgisi bulunuyorsa başlık baytlarını offset ile atlamak veya önce başlığı ayrı okumak gerekir.Düzenli olarak paylaşılacak NumPy verileri için yalnızca ham
fromfile çıktısına güvenmek yerine veri türünü ve şekli ayrıca saklayan bir biçim tercih etmek daha güvenlidir. fromfile hızlı ve basit bir ham veri okuyucusudur; ancak dosyaya veri türü ve boyut bilgisi eklemez.