因此,我需要记录一组4个整数,它们的值在一天中的每一秒都不同。 IE。:

#Here the values are initialized to the same value, however they will change as samples are taken
data = [[.25 for numData in range(4)] for numSecs in range(86400)]

现在显然第一个索引长度为86400的二维数组(如python,LIST)是非常不切实际的。相反,我想创建一个文本格式为86400的文本文件:
numSec data0 data1 data2 data3

0 .25 .25 .25 .25
1 .25 .25 .25 .25
2 .25 .25 .25 .25
...

在获取样本时,我希望能够编辑此文件,不,我希望能够编辑文件的行,该行的numSec =样本的第二秒。例如,以numSec = 2(午夜后2秒)获取的样本将导致我的程序编辑文件,以便:
0 .25 .25 .25 .25
1 .25 .25 .25 .25
2 .70 .10 .10 .10
...

看起来很容易,我什至读了很多帖子,它们演示了如何在文本文件中重写单个文件。问题是,它们都要求您读取整个文件。我不希望我的程序每秒读取86,400行。

因此,我们想到了一个问题:我可以在文本文件中读取一行,对其进行编辑,然后将其写回到该文件中,而不必每次都需要进行更改时读取整个文件吗?

P.S.我应该注意我正在运行Ubuntu 12.04(Precise),这是在ROS节点中使用的

P.P.S该程序将运行任意天,因此每个“秒”数据都可以读取和重写多次。我还要使用文件的另一个原因是,如果需要关闭系统,我想在下次运行时保存发行版。

最佳答案

您可能需要对此进行一点修改,并假设所有行的长度都相同。为此,我必须将第一列填充到固定宽度。但是,如果您不想填充,则应该能够计算出特定行之前的1,2,3,4,..数字位数。

data = [[.25 for numData in range(4)] for numSecs in range(86400)]
length_line=0

def write_line(f, sec, data):
    line="{:6d}".format(sec) + " " +" ".join(
            ["{:.2f}".format(dd) for dd in data])+"\n"
    f.write(line)
    return len(line)

with open('output', 'w') as of:
    for i,d in enumerate(data):
        length_line=write_line(of, i, d)

with open('output', 'rb+') as of:
    # modify the 2nd line:
    n = 2
    of.seek(n*length_line)
    write_line(of, n, [0.10,0.10,0.10,0.10])
    # modify the 10th line:
    n = 10
    of.seek(n*length_line)
    write_line(of, n, [0.10,0.10,0.10,0.10])

09-04 10:34
查看更多