6

所以我需要记录一组 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 的二维数组(gah 它的 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 行。

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

PS我应该注意我正在运行Ubuntu 12.04(精确),这是用于ROS节点

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

4

4 回答 4

3

您可能需要稍微修改一下,它假定所有行的长度相同。为此,我必须将第一列填充到固定宽度。但是,如果您不想要填充,您应该能够计算特定行之前的 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])
于 2013-06-11T01:02:24.440 回答
2

如果行的长度不同,那么修改行之后的所有内容都将位于错误的位置,您必须重写所有这些行。如果这些行都具有相同的长度,那么您可以通过计算文件中行的偏移量seek()write()获取新数据。有关详细信息,请参阅Python 文件对象

于 2013-06-11T00:49:41.400 回答
0

如果我是你,我会使用 sqlite 数据库来存储记录。关键是观察的第二个,每行包含 4 个值。更新和编辑会更有效率。

于 2013-11-01T15:42:13.163 回答
0

我不确定存储 345600 (86400 * 4) 乘以 0.25 是否有用。只需将默认值存储在第一行。比一次追加一行。如果时间戳不按顺序排列,只需将它们按原样放入,一天结束后,对文件内容进行一次排序,并用默认值填充缺失的时间戳。例子:

default: 0.25
2 .70 .10 .10 .10
3 .80 .20 .20 .20
1 .50 .30 .30 .30
5 .40 .30 .30 .30

稍后处理此文件以获得此文件:

1 .50 .30 .30 .30
2 .70 .10 .10 .10
3 .80 .20 .20 .20
4 .25 .25 .25 .25
5 .40 .30 .30 .30
于 2013-06-11T01:13:38.600 回答