使用python将数组值存储在文本文件中

时间:2014-09-22 06:27:47

标签: python python-2.7

我正在使用python 2.7 。 我从UART获取串行数据。

我正在尝试保存串行数据值以及接收数据时的实时数据。

从UART收到的数据格式如下:

2.1862745098X 2.42156862745X 2.42156862745X 0.401960784314X 0.0X 0.637254901961X 1.49019607843X ............等等

我使用以下代码保存值和时间:

f1 = open('accelerometer sensor1.txt','w')
while 1:
 # Read from serial port, blocking
 data =ser.read(1)
 data1=(data)


 # If there is more than 1 byte, read the rest
 n = ser.inWaiting()
 data1 = (data1 + ser.read(n))
 l = data1.split( )

 #t1 = datetime.datetime.now()



 x = [d.strip("X") for d in l if d[len(d)-1] == "X"]
 for i in range(0,len(x)):
     f1.write(str(datetime.datetime.now()))
     f1.write("\t")
     f1.write(str(x[i]))
     f1.write("\n")

我面临的问题是我在特定时间收到大量值。因此,当我保存数据时,它的格式为:

2014-09-22 11:30:40.980000  2.1862745098
2014-09-22 11:30:40.980000  2.42156862745
2014-09-22 11:30:40.980000  1.71568627451
2014-09-22 11:30:40.980000  0.401960784314
2014-09-22 11:30:40.980000  0.0
2014-09-22 11:30:40.980000  0.637254901961
2014-09-22 11:30:40.980000  1.49019607843
2014-09-22 11:30:40.980000  2.42156862745
2014-09-22 11:30:40.980000  2.5
2014-09-22 11:30:40.980000  1.58823529412
2014-09-22 11:30:40.980000  0.78431372549
2014-09-22 11:30:40.980000  0.0
2014-09-22 11:30:40.980000  0.196078431373
2014-09-22 11:30:40.980000  1.17647058824
2014-09-22 11:30:40.980000  1.74509803922
2014-09-22 11:30:40.980000  2.49019607843
2014-09-22 11:30:40.980000  2.44117647059
2014-09-22 11:30:40.980000  1.33333333333
2014-09-22 11:30:40.980000  0.558823529412
2014-09-22 11:30:40.980000  0.0
2014-09-22 11:30:40.980000  0.205882352941
2014-09-22 11:30:40.980000  1.43137254902
2014-09-22 11:30:40.980000  2.08823529412

我不希望采用这种格式,我想要收到的每个样本的实时时间,而不是实时收到的一组样本点。

我希望文本文件显示如下:

2014-09-22 11:30:40.980000  2.1862745098
2014-09-22 11:30:40.980010  2.42156862745
2014-09-22 11:30:40.980020  1.71568627451
2014-09-22 11:30:40.980030  0.401960784314
2014-09-22 11:30:40.980040  0.0

我该怎么办?请提出一些建议。

Thanks`

修改

我希望每个采样点都有不同的时间戳。这应该是可能的,因为每个采样点分别通过串行端口而不是组。我认为在阅读这些样本点时可能存在问题,如果我能以某种方式单独阅读它们,那么我的目的就会得到解决。

我尝试单独获取每个样本点。我能够这样做,但代码变得非常慢。 我刚刚做了

data =ser.readline(5)
     data1=(data)

通过UART传递的值类型如下: 127X 154X 100X 158X 0X 20X .............

有没有办法单独读取值,也不会影响速度。

1 个答案:

答案 0 :(得分:0)

我想你想在时间戳中得到数字的平均值。请查看此代码,它会聚合给定值,如果时间戳不同,则将其写入文件。

缓存变量应在循环外初始化; - )

cache = ('', 0, 0.0)

def aggregate(value):
    now = str(datetime.datetime.now())

    c_date, c_count, c_avg = cache
    if now != c_date:
        # write c_avg and c_date to file
        f1.write(c_date)
        f1.write("\t")
        f1.write(str(c_avg))
        f1.write("\n")

        # after that, clear c_count and c_avg
        c_count = 0
        c_avg = 0.0

    if c_count is 0:
        c_count = 1
        c_avg = float(value)
    else:
        c_avg = ((c_avg * c_count) + float(value)) / (c_count + 1)
        c_count += 1

    cache = (now, c_count, c_avg)


for i in range(0,len(x)):
    aggregate(x[i])

我希望这能满足您的需求。

干杯