ファイル /etc/conf1 があるとしましょう
その内容は次のとおりです
option = banana
name = monkey
operation = eat
「サル」を「ダチョウ」に置き換えたいとしましょう。ファイルをメモリに読み込んで変更し、すべてを書き戻すことなく、どうすればそれを行うことができますか? 基本的に、ファイルを「その場で」変更するにはどうすればよいですか?
ファイル /etc/conf1 があるとしましょう
その内容は次のとおりです
option = banana
name = monkey
operation = eat
「サル」を「ダチョウ」に置き換えたいとしましょう。ファイルをメモリに読み込んで変更し、すべてを書き戻すことなく、どうすればそれを行うことができますか? 基本的に、ファイルを「その場で」変更するにはどうすればよいですか?
できません。「ダチョウ」は「サル」よりも 1 文字多いので、少なくともその時点からファイルを書き直す必要があります。ファイル システムは、ファイル コンテンツの上方または下方への「シフト」をサポートしていません。
ほんの小さなファイルであれば、これさえ気にする必要はなく、ファイル全体を書き直した方がよいでしょう。
ファイルが非常に大きい場合は、ブロックベースのアプローチなどを使用して、ファイルの内容の内部設計を再検討する必要があります。
fileinput モジュールを見てください:
http://docs.python.org/library/fileinput.html
入力メソッドを介してインプレース編集を実行するオプションがあります。
http://docs.python.org/library/fileinput.html#fileinput.input
更新 - コード例:
import fileinput
import re
import sys
for line in fileinput.input(inplace=True):
sys.stdout.write(re.sub(r'monkey', 'ostrich', line))
sys.stdout.write を使用して、余分な改行を追加しないようにします。
sed -i.bak '/monkey$/newword/' file
「その場で」が何を意味するかによって異なります。monkey
に置き換えたい場合はどうすればよいですsupercalifragilisticexpialidocious
か?残りのファイルを上書きしますか? そうでない場合は、先読みして、ファイルの後続の内容を前方にシフトする必要があります。
CPU 命令は、メモリからのデータを処理します。
ファイルの読み取りたい部分は、読み取る前にメモリに常駐している必要があります。ディスクに何かを書き込む前に、その情報がメモリ内にある必要があります。
ファイル全体が一度にそこにある必要はありませんが、ファイル全体で検索置換を行うには、ファイルのすべての文字がある時点で RAM を通過します。
おそらく探しているのは、mmap() システム コールのようなものです。上記の fileinput モジュールは、使用するのにもっともらしいように思えます。
ファイルのサイズを変更しないか、ファイルに追加するだけの場合にのみ、インプレース変更は簡単です。次の例では、ファイルの最初のバイトを「a」文字に置き換えます。
fd = os.open("...", os.O_WRONLY | os.O_CREAT)
os.write(fd, "a")
os.close(fd)
Python のfile
オブジェクトはこれをサポートしていないことに注意してください。低レベルの関数を使用する必要があります。open()
追加するには、関数を"a"
モードにしてファイル file を開きます。