1. ホーム
  2. パイソン

[解決済み】open withステートメントを使用してファイルを開く方法

2022-04-02 13:22:05

質問内容

Pythonでファイルの入出力を行う方法について調べています。私は以下のコードを書きました。ファイルから名前のリスト(1行に1つ)を別のファイルに読み込み、ファイル内の名前と名前を照合し、ファイル内の出現箇所にテキストを追加します。このコードは動作します。もっといい方法はないでしょうか?

を使いたかったのですが with open(... ステートメントを入力ファイルと出力ファイルの両方に使用することができますが、それらが同じブロック内に存在することができませんので、名前を一時的な場所に保存する必要があります。

def filter(txt, oldfile, newfile):
    '''\
    Read a list of names from a file line by line into an output file.
    If a line begins with a particular name, insert a string of text
    after the name before appending the line to the output file.
    '''

    outfile = open(newfile, 'w')
    with open(oldfile, 'r', encoding='utf-8') as infile:
        for line in infile:
            if line.startswith(txt):
                line = line[0:len(txt)] + ' - Truly a great person!\n'
            outfile.write(line)

    outfile.close()
    return # Do I gain anything by including this?

# input the name you want to check against
text = input('Please enter the name of a great person: ')    
letsgo = filter(text,'Spanish', 'Spanish2')

解決方法は?

Pythonでは、複数の open() ステートメントを1つの with . カンマで区切るのですね。 そうすると、次のようなコードになります。

def filter(txt, oldfile, newfile):
    '''\
    Read a list of names from a file line by line into an output file.
    If a line begins with a particular name, insert a string of text
    after the name before appending the line to the output file.
    '''

    with open(newfile, 'w') as outfile, open(oldfile, 'r', encoding='utf-8') as infile:
        for line in infile:
            if line.startswith(txt):
                line = line[0:len(txt)] + ' - Truly a great person!\n'
            outfile.write(line)

# input the name you want to check against
text = input('Please enter the name of a great person: ')    
letsgo = filter(text,'Spanish', 'Spanish2')

また、明示的に return を関数の末尾に追加します。 を使うことができます。 return を使うと早く終了してしまいますが、あなたはそれを最後に持っていたので、それがないと関数が終了します。 (もちろん、値を返すような関数では、このように return で返す値を指定します)。

複数の open() という項目があります。 with は Python 2.5 ではサポートされていませんでした。 with 文が導入された Python 2.6 ではサポートされていますが、Python 2.7 と Python 3.1 以降ではサポートされています。

http://docs.python.org/reference/compound_stmts.html#the-with-statement http://docs.python.org/release/3.1/reference/compound_stmts.html#the-with-statement

Python 2.5, 2.6, 3.0 で動作させる必要があるコードを書いている場合は、 ネストして with を使用するか、または、他の回答が示唆するように contextlib.nested .