繁体   English   中英

编辑大型文本文件中的单行

[英]Editing a single line in a large text file

所以我需要记录一组4个整数,它们的值在每天的每一秒都不同。 即:

#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)]

现在显然是一个二维数组(gah它的python,LIST),其第一个索引长度是86400是非常不切实际的。 相反,我想创建一个文本文件,其格式为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该程序将运行任意数天,因此可以多次读取和重写每个“第二”数据。 我想使用文件的另一个原因是,如果系统需要关闭,我想保存下次运行时的分发。

您可能需要对此进行一些修改,并假设所有行都具有相同的长度。 为此,我必须将第一列填充到固定宽度。 但是如果你不想填充,你应该能够计算特定行之前的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])

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

我不确定将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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM