Skip to content

Instantly share code, notes, and snippets.

@lmyyao
Created March 2, 2020 11:49
Show Gist options
  • Save lmyyao/418a9453358c94b25ed2c76e81b34419 to your computer and use it in GitHub Desktop.
Save lmyyao/418a9453358c94b25ed2c76e81b34419 to your computer and use it in GitHub Desktop.
python write c struct to file
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