2015-12-28 82 views
-5

我充滿了分隔符隔開的信息和數字的一些文件:如何修改特定行的文件

101|something|something|2|something 
102|something|something|6|something 
103|something|something|2|something 
104|something|something|5|something 

我想要做的是遞減的第4場的數量,在指定的特定線路通過我給的一些輸入。行號是每行中的第一個字段。

例子:

input = 103 

預期結果的文件:

101|something|something|2|something 
102|something|something|6|something 
103|something|something|1|something 
104|something|something|5|something 

的問題是,我不知道該怎麼寫回,因爲我可以有相同的號碼在幾行中。

此外我正在使用列表。

+2

向我們展示您卡在哪裏的代碼 – karthikr

+0

我剛纔在這裏寫了 – RedIcon

+0

Readlines and read,但是當我嘗試更改/減少我的行號時,它會更改每行的數字。 – RedIcon

回答

0

一般來說,除非數據格式化爲固定結構,否則不需要直接修改文件內容(就地)。最常用的方法是重命名現有文件,將其打開以便讀取,並以同樣的名稱爲寫入訪問打開一個新文件。然後通過輸入數據進行流式處理,在寫回數據之前執行任何轉換或修改。

另一種更安全的方法是從現有文件中讀取數據,寫入一個新文件並執行「鏈接跳舞」,以原始名稱將新文件鏈接到舊名稱的位置,同時將原始文件保存爲備份名稱。 (短語「鏈接舞蹈」與Unix和Linux文件系統或其他提供相似語義的人有關)。

如果您嘗試修改文件,那麼您可能會發現必須將所有數據轉移到已寫入更改的各個點以考慮數據大小的變化。例如,如果數據中的任何數字從3位數字變爲4或從1變爲任何其他大小。你可以做到這一點......但伴隨着相當高的數據丟失和腐敗風險。這可以通過一些信號處理(阻塞信號)來緩解,並通過使用模塊將文件映射到內存區域,並使用可以很好地從Python轉換到較低級系統的分割/範圍基元來執行操作您正在對數據執行的操作。如果您的操作系統支持理智的內存映射語義,那麼這將比通過讀取()write()操作將數據移入和移出緩衝區本質上更高效。