2015-10-13 6 views
10

में बाइनरी फ़ाइल लिखना/पढ़ना निम में बाइनरी फ़ाइलों को लिखने और पढ़ने का सबसे अच्छा तरीका क्या है? मैं एक बाइनरी फ़ाइल में वैकल्पिक फ्लोट्स और इनट्स लिखना चाहता हूं और फिर फ़ाइल को पढ़ने में सक्षम हूं। अजगर में मैंनिम

import struct 

# list of alternating floats and ints 
arr = [0.5, 1, 1.5, 2, 2.5, 3] 

# here 'f' is for float and 'i' is for int  
binStruct = struct.Struct('fi' * (len(arr)/2)) 
# put it into string format 
packed = binStruct.pack(*tuple(arr)) 

# open file for writing in binary mode 
with open('/path/to/my/file', 'wb') as fh: 
    fh.write(packed) 

की तरह कुछ करना होगा पढ़ने के लिए मैं की तरह

arr = [] 
    with open('/path/to/my/file', 'rb') as fh: 
    data = fh.read() 
    for i in range(0, len(data), 8): 
     tup = binStruct.unpack('fi', data[i: i + 8]) 
     arr.append(tup) 

इस उदाहरण में कुछ करना चाहते हैं इस बाइनरी फ़ाइल लिखने के लिए, फ़ाइल को पढ़ने के बाद, आगमन होगा

[(0.5, 1), (1.5, 2), (2.5, 3)] 

निम में समान कार्यक्षमता की तलाश में है।

उत्तर

10

मुझे लगता है कि आपको streams मॉड्यूल में जो कुछ भी चाहिए उसे ढूंढना चाहिए। यहां एक छोटा सा उदाहरण दिया गया है:

import streams 

type 
    Alternating = seq[(float, int)] 

proc store(fn: string, data: Alternating) = 
    var s = newFileStream(fn, fmWrite) 
    s.write(data.len) 
    for x in data: 
    s.write(x[0]) 
    s.write(x[1]) 
    s.close() 

proc load(fn: string): Alternating = 
    var s = newFileStream(fn, fmRead) 
    let size = s.readInt64() # actually, let's not use it to demonstrate s.atEnd 
    result = newSeq[(float, int)]() 
    while not s.atEnd: 
    let element = (s.readFloat64.float, s.readInt64.int) 
    result.add(element) 
    s.close() 


let data = @[(1.0, 1), (2.0, 2)] 

store("tmp.dat", data) 
let dataLoaded = load("tmp.dat") 

echo dataLoaded 
+0

यह अच्छी तरह से काम करता है। – COM