簡體   English   中英

Python:讀取一行並寫回同一行

[英]Python: read a line and write back to that same line

我正在使用python為html制作模板更新程序。 我讀了一行並將其與模板文件進行比較,看看是否有任何需要更新的更改。 然后我想把任何更改(如果有的話)寫回我剛才讀的同一行。

讀取文件后,我的文件指針現在位於readline()之后的下一行。 無論如何,我可以回寫到同一行,而無需打開兩個文件句柄進行讀寫操作?

這是我想要做的代碼片段:

cLine = fp.readline()
if cLine != templateLine:
   # Here is where I would like to write back to the line I read from
   # in cLine

在文本文件中更新行 - 非常困難

SO中的許多問題都是嘗試讀取文件並立即更新。

雖然這在技術上是可行的,但是非常困難。

(文本)文件不是按行排列在磁盤上,而是按字節排列。

問題是,讀取舊行上的字節數通常與新行不同,這會弄亂生成的文件。

通過創建新文件進行更新

雖然聽起來效率低,但從編程的角度來看,這是最有效的方法。

只需從一側的文件中讀取,寫入另一側的另一個文件,關閉文件並復制新創建的內容。

或者在內存中創建文件,最后在關閉舊文件后再寫入舊文件。

在操作系統級別,它與Python的外觀有點不同 - 從Python開始,文件看起來幾乎就像一個字符串列表,每個字符串都有任意長度,所以看起來很容易換行而不用影響其余部分:

l = ["Hello", "world"]
l[0] = "Good bye"

但實際上,任何文件都只是一個字節流,字符串彼此跟隨而沒有任何“填充”。 因此,如果結果字符串的長度與源字符串的長度完全相同,則只能就地覆蓋數據 - 否則它只會覆蓋以下行。

如果是這種情況(您的處理保證不更改字符串的長度),您可以將文件“倒回”到行的開頭並用新數據覆蓋該行。 下面的腳本將文件中的所有行轉換為原位大寫:

def eof(f):
    cur_loc = f.tell()
    f.seek(0,2)
    eof_loc = f.tell()
    f.seek(cur_loc, 0)
    if cur_loc >= eof_loc:
        return True
    return False

with open('testfile.txt', 'r+t') as fp:

    while True:
        last_pos = fp.tell()
        line = fp.readline()
        new_line = line.upper()
        fp.seek(last_pos)
        fp.write(new_line)
        print "Read %s, Wrote %s" % (line, new_line)
        if eof(fp):
            break

有點相關: 撤消Python文件readline()操作,使文件指針恢復原始狀態

只有當您的輸出行保證具有相同的長度時,才會證明這種方法是合理的,例如,當您使用的文件非常龐大時,您必須在適當的位置對其進行修改。

在所有其他情況下,只需在內存中構建輸出並立即將其寫回,就會更容易,更高效。 另一種選擇是寫入臨時文件,然后刪除原始文件並重命名臨時文件,以便替換原始文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM