2016-11-22 43 views
0

刚刚一些帮助,因为我是新的python。我有一个文件,它是一个输出文件,通过外部进程不断写入数据。我正在调查这个文件的'x'时间段,并打印输出到屏幕上和/或将它存储在一个列表/字典/元组中(不确定python中适用的是什么)。从二进制输出存储值到列表/字典/元组(Python)

这是我在这个阶段:

timeout = time.time() + args.duration 
with open('/dev/input/accel', 'rb') as o: 
    while time.time() < timeout: 
     data = o.read(16) 
     sec, microsec, valtype, axis, axisval = struct.unpack(
      'LLHHi', data) 
     tampertime = float(str(sec) + '.' + str(microsec)) 

     if valtype == 3: 
      print(tampertime, axis, axisval) 

和输出是这样的(从结构):

secs.microsecs, axis, axis value 
--------------------------- 
1478574443.4219799, 0, 4080 
1478574443.4219799, 1, 1168 
1478574443.4219799, 2, -15408 
1478574443.542166, 0, 4016 
1478574443.542166, 1, 1104 
1478574443.6621571, 0, 4022 
1478574443.6621571, 1, 1120 
1478574443.6621571, 2, -15404 
1478574443.7821031, 0, 4016 
1478574443.7821031, 1, 1216 
1478574443.7821031, 2, -15430 
1478574443.9019749, 0, 4022 
1478574443.9019749, 1, 1152 
1478574444.2220099, 1, 1148 
1478574444.2220099, 2, -15344 

注:我刚才添加的逗号更容易阅读。

它打印出其他值,但我只想要valtype == 3(这是一个列在上面的输出中未显示)的数字。

要快速解释三列,第一列是时间(epoch/unix),第二列是'钥匙',第三列是与钥匙相关的值。你会注意到,如果键值没有改变,它只是从输出中忽略它(我无法解决这个问题,它只是输出文件处理值的方式)。

所以使用上面的输出,我正在寻找这种输出格式。

secs.microsecs, 0, 1, 2 
---------------------------------------- 
1478574443.4219799, 4080, 1168, -15408* 
1478574443.542166, 4016, 1104, -15408* 
1478574443.6621571, 4022, 1120, -15404 
1478574443.7821031, 4016, 1216, -15430* 
1478574443.9019749, 4022*, 1152, -15430* 
1478574444.2220099, 4022*, 1148, -15344 

你会注意到我放置星号旁边的值实际上对应于它们以前的值(上图)。即没有为该时间戳实际提供值,所以它应该只使用存储的先前值。

我已经做了一点搜索,并考虑制作一个结构,但我没有任何运气。

任何帮助将不胜感激。

回答

0

只是回答我的问题。因为我希望在每次执行后打印出这些值(一旦检索到x,y和z值),我就使用此解决方案。我注意到在我的二进制文件中有一个刷新值,我可以通过轮询和检查来触发打印。

这里基本上是我的完整代码:输出

class Sample: 

    def __init__(self): 
     self.x = None 
     self.y = None 
     self.z = None 
     self.ts_sec = None 
     self.ts_usec = None 

    def print_val(self): 
     print("{0}.{1},{2},{3},{4}".format(
      self.ts_sec, self.ts_usec, self.x, self.y, self.z)) 


def DisplaySamples(samples): 
    for s in samples: 
    s.print_val() 


def UpdateSample(data, sample): 
    flush = False 
    sec, usec, valtype, axis, axisval = struct.unpack('LLHHi', data) 

    sample.ts_sec = sec 
    sample.ts_usec = usec 
    if valtype == 3: 
     if axis == 0: 
      sample.x = axisval 
     if axis == 1: 
      sample.y = axisval 
     if axis == 2: 
      sample.z = axisval 
    if valtype == 0: 
     flush = True 

    return sample, flush 


def main(): 
    with open('/dev/input/accel', 'rb') as o: 
     sample = Sample() 
     while time.time() < timeout: 
      data = o.read(16) 

      sample, flush = UpdateSample(data, sample) 

      if flush: 
       DisplaySamples([sample]) 
    o.close() 

例,CSV格式。

1478733511.251977,2896,-367,None 
1478733511.372184,2768,-343,-15648 
1478733511.492175,2752,-337,-15776 
1478733511.612123,2888,-408,-15648 
1478733511.732160,2888,-408,-15728 
1478733511.852204,2868,-320,-15608 
1478733511.972208,2838,-384,-15624 
1478733512.92151,2819,-388,-15624 
1478733512.212153,2819,-370,-15856 
1478733512.332126,2888,-370,-15664 
1478733512.452203,2860,-370,-15776 
1478733512.572205,2882,-345,-15608 
1478733512.692160,2768,-350,-15760 
1478733512.812114,2880,-350,-15760 
1478733512.932126,2768,-416,-15696 
1478733513.52211,2840,-444,-15690 
1

您可以使用defaultdict此:

from collections import defaultdict 
d1=defaultdict(dict) 
timeout = time.time() + args.duration 
with open('/dev/input/accel', 'rb') as o: 
    while time.time() < timeout: 
     data = o.read(16) 
     sec, microsec, valtype, axis, axisval = struct.unpack(
      'LLHHi', data) 
     tampertime = float(str(sec) + '.' + str(microsec)) 
     if valtype == 3: 
      d1[tampertime][axis] = axisval # dict with all values 

tmp = {0: 0, 1: 0, 2:0} 
for k in sorted(d1.keys()): #iterate through dict and customize output format 
    for j in range(3): 
     if d1[k].get(j) is None: 
      d1[k][j] = tmp[j] 
    tmp = d1[k] 
    print(k, d1[k]) 

输出:

1478574443.42198 {0: 4080, 1: 1168, 2: -15408} 
1478574443.542166 {0: 4016, 1: 1104, 2: -15408} 
1478574443.662157 {0: 4022, 1: 1120, 2: -15404} 
1478574443.782103 {0: 4016, 1: 1216, 2: -15430} 
1478574443.901975 {0: 4022, 1: 1152, 2: -15430} 
1478574444.22201 {0: 4022, 1: 1148, 2: -15344}