Created
March 2, 2020 11:49
-
-
Save lmyyao/418a9453358c94b25ed2c76e81b34419 to your computer and use it in GitHub Desktop.
python write c struct to file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from ctypes import * | |
import time | |
import datetime | |
class Record(Structure): | |
_fields_ = [ | |
("time", c_double), | |
("count", c_double) | |
] | |
def __str__(self): | |
return f"time:{self.time2obj()}\tcount:{self.count}" | |
def time2obj(self): | |
return datetime.datetime.fromtimestamp(self.time) | |
class BinaryFile(object): | |
def __init__(self, name, T): | |
self.T = T | |
self.Tsize = sizeof(T) | |
self._f = open(name, "ab+") | |
def close(self): | |
self._f.close() | |
def write(self, **args): | |
return self._f.write(bytearray(self.T(**args))) | |
def _read(self, size): | |
return self._f.read(size) | |
def readn(self,n=1): | |
buffer = self._read(self.Tsize * n) | |
newT = self.T * n | |
return newT.from_buffer_copy(buffer) | |
def seek(self, offset, whence): | |
return self._f.seek(offset, whence) | |
def tell(self): | |
return self._f.tell() | |
def readfull(self): | |
self.seek(0,2) | |
fsize = self.tell() | |
n = int(fsize / self.Tsize) | |
self.seek(0,0) | |
return self.readn(n) | |
def readlast(self): | |
self.seek(0,2) | |
fsize = self.tell() | |
if fsize < self.Tsize: | |
return None | |
self.seek(fsize-self.Tsize, 0) | |
return self.readn() | |
if __name__ == "__main__": | |
bf = BinaryFile("test.bin", Record) | |
record = bf.readlast() | |
t, count = time.time(), 1 | |
if record is not None: | |
count = record[0].count + 1 | |
for _ in range(10): | |
bf.write(time=t, count=count) | |
time.sleep(0.01) | |
t = time.time() | |
count += 1 | |
rows = bf.readfull() | |
for i in rows: | |
print(i) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment