0

同様のコードの 2 つのバージョンがあります。1 つは機能し、もう 1 つは機能しません。

バージョン 1

  #some code
with open('file', 'w') as f:
        f.writelines(new_lines)

with open('file') as f:
        i = 0
        for line in f:
           i = i + 1
           if i != 5 and i != 18 and i != 27:
              row.append(line)

バージョン 2

   # some code
with open('file', 'w') as f:
        f.writelines(new_lines)
        i = 0
        for line in f:
           i = i + 1
           if i != 5 and i != 18 and i != 27:
              row.append(line)

バージョン 2 のコードを実行すると、ファイルが開いていないというエラーが表示されました。明らかにコードがまだwithステートメントにあるため、混乱しました。f.writelines() メソッドの直後にファイルが自動的に閉じられますか?

4

2 に答える 2

2

あなたが抱えている問題は、ファイルを開くために使用しているモードに関係しています。最初の例では、最初に"w"モードで書き込み用に開きます。次に、それを閉じて、デフォルト"r"モードで再度開きます。これは違います!

"w"まず、通常モードで開いているファイルから読み取ることはできません。"w+"読み取りと書き込みの両方を許可する場合や"r+"、ファイルを開いた直後にファイルを切り詰めたくない場合に使用できます。

もう 1 つの問題は、ファイル内の現在の場所です。データをファイルに書き込むと、ファイルのデータの最後に到達するため、そこから読み取るだけでは何も得られません。f.seek(0)ファイルの先頭に戻るために呼び出す必要があるため、再度読み取ることができます。

しかし、ファイルを書き込んでから、書き込んだばかりの行を読み返すのは少しばかげています (他の複雑なロジックが含まれていない限り)。for line in f代わりにループを作成することをお勧めしますfor line in new_lines。これにより、ファイルが不必要に読み取られるのを回避できます。

于 2013-10-02T03:02:58.603 に答える
1

書き込みモードでファイルを反復処理しています。に変更しますwith open('file', 'r+') as f:

の後f.writelines(new_lines)、各行を繰り返すためにファイルの先頭に戻る必要もあります。f.seek(0)ループの前に入れる

于 2013-10-02T02:59:28.430 に答える