2

ファイル /etc/conf1 があるとしましょう

その内容は次のとおりです

option = banana
name = monkey
operation = eat

「サル」を「ダチョウ」に置き換えたいとしましょう。ファイルをメモリに読み込んで変更し、すべてを書き戻すことなく、どうすればそれを行うことができますか? 基本的に、ファイルを「その場で」変更するにはどうすればよいですか?

4

6 に答える 6

2

できません。「ダチョウ」は「サル」よりも 1 文字多いので、少なくともその時点からファイルを書き直す必要があります。ファイル システムは、ファイル コンテンツの上方または下方への「シフト」をサポートしていません。

ほんの小さなファイルであれば、これさえ気にする必要はなく、ファイル全体を書き直した方がよいでしょう。

ファイルが非常に大きい場合は、ブロックベースのアプローチなどを使用して、ファイルの内容の内部設計を再検討する必要があります。

于 2010-07-05T08:49:55.517 に答える
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 を使用して、余分な改行を追加しないようにします。

于 2010-07-05T08:48:24.240 に答える
0

sed -i.bak '/monkey$/newword/' file

于 2010-07-05T10:11:41.717 に答える
0

「その場で」が何を意味するかによって異なります。monkeyに置き換えたい場合はどうすればよいですsupercalifragilisticexpialidociousか?残りのファイルを上書きしますか? そうでない場合は、先読みして、ファイルの後続の内容を前方にシフトする必要があります。

于 2010-07-05T08:51:48.853 に答える
0

CPU 命令は、メモリからのデータを処理します。

ファイルの読み取りたい部分は、読み取る前にメモリに常駐している必要があります。ディスクに何かを書き込む前に、その情報がメモリ内にある必要があります。

ファイル全体が一度にそこにある必要はありませんが、ファイル全体で検索置換を行うには、ファイルのすべての文字がある時点で RAM を通過します。

おそらく探しているのは、mmap() システム コールのようなものです。上記の fileinput モジュールは、使用するのにもっともらしいように思えます。

于 2010-07-05T08:52:05.053 に答える
0

ファイルのサイズを変更しないか、ファイルに追加するだけの場合にのみ、インプレース変更は簡単です。次の例では、ファイルの最初のバイトを「a」文字に置き換えます。

fd = os.open("...", os.O_WRONLY | os.O_CREAT)
os.write(fd, "a")
os.close(fd)

Python のfileオブジェクトはこれをサポートしていないことに注意してください。低レベルの関数を使用する必要があります。open()追加するには、関数を"a"モードにしてファイル file を開きます。

于 2010-07-05T08:59:01.487 に答える