4

ファイルのユーザー入力を取得し、ファイル内でユーザーが指定した文字列を削除するプログラムを作成するという問題に取り組んでいます。私が持っているもの(以下)から質問が求めているものに行く方法がわかりません。いつものように、どんな助けも大歓迎です。

def main():
    outfile = open(input("Enter a file name: "), "a")
    string = input("Enter the string to be removed: ")
    for string in outfile.readlines():
        string = string.replace(string, "")
    outfile.close()
    print("Done")

main()

私は提案の1つを取り、それを機能させようとしましたが、以下のコメントで述べたように、以下のコードはエラーを返さず、空のファイルを作成します. 新しいファイルを文字列が削除された古いファイルにするために何が欠けていますか?

def main():
    inpath = input("Enter an input file: ")
    line = input("Enter what you want to remove: ")
    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(line, "") + "\n")
    print("Done.")

main()
4

1 に答える 1

9

詳細に入る前に、いくつかの注意事項: を呼び出すときは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 ツールが好んsedsort行っていることです。 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 の違いのため、少し注意が必要です。ただし、いくつかの大きな利点があります。(たとえば、プログラムが操作の途中で強制終了された場合、それがどのように発生したとしても、書きかけの混乱ではなく、元のファイルまたは新しいファイルのいずれかを保持することが保証されます。)

于 2012-11-13T23:17:16.347 に答える