簡體   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