使用Python FileInput進行原地編輯


原地編輯是一種允許我們直接修改檔案內容的技術,無需建立新檔案或將整個檔案載入到記憶體中。它透過允許我們直接對現有檔案進行更改來提供簡化的檔案操作方法,使其成為一種高效且資源友好的方法。

為了在Python中方便原地編輯,可以使用`fileinput`模組。`fileinput`模組是Python標準庫的一部分,它提供了一個高階介面來讀取和寫入檔案,簡化了原地編輯的過程。使用`fileinput`模組,我們可以開啟一個檔案進行原地編輯,迭代其行,進行修改,並將更改直接儲存到檔案中。

Fileinput 模組

Python中的`fileinput`模組提供了一種方便高效的方式來執行檔案的原地編輯。它抽象了檔案處理和迭代的複雜性,使直接修改檔案內容變得更容易。

在我們開始使用`fileinput`模組之前,我們需要將其匯入到我們的Python指令碼中。我們可以在程式碼開頭包含以下匯入語句:

import fileinput

開啟檔案進行原地編輯

要開啟一個檔案進行原地編輯,我們使用`fileinput.input()`函式。此函式將檔案路徑作為引數,並返回`fileinput.FileInput`類的例項,該例項提供讀取和修改檔案所需的方法。

要開啟一個檔案進行原地編輯,我們需要將檔案路徑作為引數提供給`fileinput.input()`函式。例如,假設我們有一個名為“example.txt”的檔案,我們想對其進行原地編輯。我們可以使用以下程式碼開啟它進行原地編輯:

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      # Modify the line as needed

在上面的程式碼中,我們透過將它的路徑傳遞給`fileinput.input()`函式來開啟“example.txt”檔案進行原地編輯。`inplace=True`引數告訴`fileinput`模組原地修改檔案。

假設“example.txt”檔案中有以下內容:

This is a sample file.
It contains some foo words.

讓我們使用Python進行原地編輯。

示例1

為每一行新增字首

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      modified_line = "Prefix: " + line
      print(modified_line, end='')

輸出

Prefix: This is a sample file.
Prefix: It contains some foo words.
Prefix: Let's perform inplace editing using Python.

示例2

移除行首和行尾的空格

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      modified_line = line.strip()
      print(modified_line, end='')

輸出

This is a sample file.
It contains some foo words.
Let's perform inplace editing using Python.

修改檔案

一旦檔案被開啟進行原地編輯,我們就可以使用for迴圈迭代它的行。`fileinput.input()`返回的`fileinput.FileInput`物件類似於常規檔案物件,可以在迴圈中使用它來訪問檔案的每一行。

以下是迭代檔案中各行的示例:

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      # Modify the line as needed

例如,假設我們想要替換每一行中所有出現的“foo”字詞為“bar”。我們可以使用`replace()`方法來實現:

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      modified_line = line.replace('foo', 'bar')

在上面的程式碼中,我們用'bar'替換每一行中'foo'字串的出現,並將修改後的行儲存在`modified_line`變數中。您可以根據您的具體用例,使用任何所需的邏輯或操作來修改行。以下是一些示例,以說明一些常見的修改。

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      # Example 1: Adding a prefix to each line
      modified_line = "Prefix: " + line

      # Example 2: Removing leading and trailing whitespace
      modified_line = line.strip()

      # Example 3: Reversing the line
      modified_line = line[::-1]

      # Example 4: Converting to uppercase
      modified_line = line.upper()

假設我們使用與之前相同的“example.txt”檔案內容:

This is a sample file.
It contains some foo words.
Let's perform inplace editing using Python.

示例3

反轉行

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      modified_line = line[::-1]
      print(modified_line, end='')

輸出

elif elpmis elgnitedi ecnetneidni repmetS
.sdrow oof emos sniatnoc tnuocnoc sI
.enilpmeb saw elpmis a si sihT

示例4

轉換為大寫

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      modified_line = line.upper()
      print(modified_line, end='')

輸出

THIS IS A SAMPLE FILE.
IT CONTAINS SOME FOO WORDS.
LET'S PERFORM INPLACE EDITING USING PYTHON.

這些示例演示了可以使用原地編輯應用於檔案每一行的不同修改。

儲存修改後的檔案

一旦我們對每一行進行了必要的修改,我們就需要將更改儲存迴文件。`fileinput`模組提供了一種方便的方法來使用`print()`函式實現此目的。

要儲存對行的更改,我們使用`print()`函式並將修改後的行作為引數傳遞。預設情況下,`print()`函式將輸出寫入標準輸出(通常是控制檯)。但是,在原地編輯的上下文中,我們希望將輸出重定向迴文件。

為了實現這一點,我們需要為`print()`函式傳遞一個附加引數:`end=''`。此引數確保不會向輸出新增任何額外的換行符,這會干擾檔案的原始格式。

以下是用`print()`將修改後的行寫回檔案的示例:

with fileinput.input('example.txt', inplace=True) as f:
   for line in f:
      modified_line = line.replace('foo', 'bar')
      print(modified_line, end='')

在上面的程式碼中,`print(modified_line, end='')`語句將修改後的行寫回開啟以進行原地編輯的檔案。

需要注意的是,當使用`print()`函式將修改後的行寫回檔案時,我們需要確保正確處理換行符。預設情況下,`print()`函式會在每一行末尾新增換行符。在原地編輯中,我們希望保留原始的行尾。

為了實現這一點,我們使用`end=''`引數,它指示`print()`不要在行尾新增任何其他字元。這樣,我們就可以保持檔案中原始的行尾。

結論

在這篇文章中,我們研究了使用Python中的`fileinput`模組進行各種形式的原地編輯。我們探討了如何開啟檔案進行原地編輯,修改其內容以及儲存修改後的檔案。現在,您將對如何高效地利用原地編輯有一個紮實的理解,使您能夠更有效地處理檔案操作任務。但是,在使用原地編輯時,務必謹慎,因為任何錯誤或意外更改都可能對原始檔案產生永久影響。

更新於:2023年8月14日

2K+ 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.