2015-05-08 3 views
8

मैं जो एक विमान की स्थिति का रिकॉर्ड होता है एक बाइनरी फ़ाइल है। जैसे प्रत्येक रिकॉर्ड देखो:Numpy fromfile का उपयोग कर एक बाइनरी फ़ाइल पढ़ें और किसी दिए गए ऑफसेट

0x00: Time, float32 
0x04: X, float32 // X axis position 
0x08: Y, float32 // Y axis position 
0x0C: Elevation, float32 
0x10: float32*4 = Quaternion (x,y,z axis and w scalar) 
0x20: Distance, float32 (unused) 

तो प्रत्येक रिकॉर्ड 32 बाइट्स लंबा है।

मैं एक Numpy सरणी प्राप्त करना चाहते हैं।

पर ऑफसेट 1859 है एक अहस्ताक्षरित पूर्णांक 32 (4 बाइट्स) जो सरणी के तत्वों की संख्या को इंगित करता है। मेरे मामले में 1201 9।

मैं (अब के लिए) परवाह नहीं है हैडर डेटा (ऑफसेट 1859)

सरणी केवल में शुरू 1863 (= 1859 + 4) ऑफसेट।

मैं की तरह

dtype = np.dtype([ 
    ("time", np.float32), 
    ("PosX", np.float32), 
    ("PosY", np.float32), 
    ("Alt", np.float32), 
    ("Qx", np.float32), 
    ("Qy", np.float32), 
    ("Qz", np.float32), 
    ("Qw", np.float32), 
    ("dist", np.float32), 
]) 

मेरे अपने Numpy dtype परिभाषित और मैं फ़ाइल fromfile का उपयोग कर पढ़ रहा हूँ:

a_bytes = np.fromfile(filename, dtype=dtype) 

लेकिन मैं नहीं दिख रहा है किसी भी पैरामीटर fromfile को प्रदान करने के लिए ऑफसेट पारित करने के लिए।

उत्तर

9

आप फ़ाइल को मानक पायथन फ़ाइल के साथ खोल सकते हैं, फिर शीर्षलेख को छोड़ना चाहते हैं, फिर फ़ाइल ऑब्जेक्ट में fromfile पर पास करें। इस तरह कुछ:

import numpy as np 
import os 

dtype = np.dtype([ 
    ("time", np.float32), 
    ("PosX", np.float32), 
    ("PosY", np.float32), 
    ("Alt", np.float32), 
    ("Qx", np.float32), 
    ("Qy", np.float32), 
    ("Qz", np.float32), 
    ("Qw", np.float32), 
    ("dist", np.float32), 
]) 

f = open("myfile", "rb") 
f.seek(1863, os.SEEK_SET) 

data = np.fromfile(f, dtype=dtype) 
print x 
+3

धन्यवाद:

यह एक समाधान है कि मेरे लिए काम किया है। यह मेरी समस्या हल हो गया। मैं भी 'डेटा = np.memmap (फ़ाइल नाम, dtype = dtype, मोड = 'आर', ऑफसेट = offset_array, आकार = एन)' ' – scls

+1

सही पर है, अगर इसकी एक बड़ी फ़ाइल तो memmap के लिए रास्ता हो सकता है देखा चले जाओ। – reptilicus

2

मुझे एक ही समस्या का सामना करना पड़ा, लेकिन मुझे ऊपर से कोई भी जवाब संतुष्ट नहीं हुआ। मैं द्विआधारी रिकॉर्ड है कि संभावित अधिक स्मृति की तुलना में मैं एक numpy सरणी में खर्च कर सकते हैं पर कब्जा कर लिया की एक बहुत बड़ी संख्या के साथ आभासी मेज की तरह कुछ को लागू करने की जरूरत है। numpy सरणी के एक सबसेट में एक फ़ाइल के एक सबसेट - तो मेरे सवाल पढ़ सकते हैं और/से एक बाइनरी फ़ाइल को पूर्णांकों का एक छोटा सेट लिखने के लिए कैसे किया गया था।

import numpy as np 
recordLen = 10 # number of int64's per record 
recordSize = recordLen * 8 # size of a record in bytes 
memArray = np.zeros(recordLen, dtype=np.int64) # a buffer for 1 record 

# Create a binary file and open it for write+read 
with open('BinaryFile.dat', 'w+b') as file: 
    # Writing the array into the file as record recordNo: 
    recordNo = 200 # the index of a target record in the file 
    file.seek(recordSize * recordNo) 
    bytes = memArray.tobytes() 
    file.write(bytes) 

    # Reading a record recordNo from file into the memArray 
    file.seek(recordSize * recordNo) 
    bytes = file.read(recordSize) 
    memArray = np.frombuffer(bytes, dtype=np.int64).copy() 
    # Note copy() added to make the memArray mutable 
संबंधित मुद्दे