詳細に入る前に、いくつかの注意事項: を呼び出すときはstring.replace(string, "")
、文字列自体を空の文字列に置き換えるように指示していることになりますstring = ""
。おそらく最初のstring
ものは置換する検索文字列なので、別の名前を付けてから、たとえばstring.replace(searchString, "")
. string
また、標準ライブラリ モジュールの名前であるため、 variable に名前を付けたくありません。入力ファイルを「outfile」と呼んでいますが、これは混乱しがちです。with
おそらく、明示的なクローズの代わりにステートメントを使用したいと思うでしょう。for line in f:
最後に、ファイル内の行を;だけで繰り返すことができます。必要ありませんfor line in f.readlines()
(そして、Python 2.x を扱う必要がある場合は、回避する方がはるかに幸せです。readlines()
、ファイル全体をメモリに読み込み、メモリ内の行の膨大なリストを作成するためです)。
JBernardo が指摘したように、最初の問題は、ファイルを「a」モードで開いたことです。これは、「書き込み専用、最後に追加する」ことを意味します。読み書きしたい場合は、「a+」または「r+」を使用できます。
ただし、それは実際には役に立ちません。結局のところ、読み取り中にファイルに書き込むことはできません。
これにはいくつかの一般的な方法があります。
まず、標準出力に出力し、結果をユーザーが好きなように処理できるようにします。たとえば、結果をファイルにリダイレクトします。(その場合、代わりにプロンプト、「完了」メッセージなどを標準エラーに出力して、ファイルにリダイレクトされないようにします。) これは、多くの Unix ツールが好んsed
でsort
行っていることです。 Unix スタイルのツールを構築していますが、他の目的には適していない可能性があります。
def stderrinput(prompt):
sys.stderr.write(prompt)
sys.stderr.flush()
return input()
def main():
with open(stderrinput("Enter a file name: "), "r") as infile:
searchString = stderrinput("Enter the string to be removed: ")
for line in infile:
print(infile.replace(searchString, ""))
sys.stderr.write("Done\n")
次に、別のファイルに書き込みます。入力ファイルを「r」モードで開き、出力ファイルを「w」モードで開き、行をコピーするだけです。
def main():
inpath = input("Enter an input file: ")
outpath = input("Enter an output file: ")
with open(inpath, "r") as infile, open("outpath", "w") as outfile:
for line in infile:
outfile.write(line.replace(searchString, "") + "\n")
3 番目に、メモリ内のファイル全体を読み取って処理し、ファイル全体を切り捨てて再書き込みします。
def main():
path = input("Enter an input/output file: ")
with open(path, "r+") as inoutfile:
lines = [line.replace(searchString, "") for line in inoutfile]
inoutfile.seek(0)
inoutfile.truncate()
inoutfile.writelines(lines)
最後に、(2 番目のオプションと同様に) 一時ファイルに書き込み、その一時ファイルを元の入力ファイルの上に移動します。このようなもの:
def main():
path = input("Enter an input/output file: ")
with open(path, "r") as infile, tempfile.NamedTemporaryFile("w", delete=False) as outfile:
for line in infile:
outfile.write(line.replace(searchString, ""))
shutil.move(outfile.name, pathname)
この最後のものは、POSIX と Windows の違いのため、少し注意が必要です。ただし、いくつかの大きな利点があります。(たとえば、プログラムが操作の途中で強制終了された場合、それがどのように発生したとしても、書きかけの混乱ではなく、元のファイルまたは新しいファイルのいずれかを保持することが保証されます。)