新しい概念を持ち込まずに、プログラムに必要なことを実行させるための最小限の変更は次のとおりです。
my_file = open("thisFile.txt", "r")
out_file = open("thatFile.txt", "w")
i = 1
for line in my_file:
if i % 2 != 0:
print(line, file=out_file)
i += 1
my_file.close()
out_file.close()
あなたの間違いは、単純int(line)
に行番号が表示されると思ったことです。それが実際に行うことは、各行のテキストを整数として解釈しようとすることですが、これはあなたが望むものではありません。
現在、Python の長所の多くは、便利な関数の膨大なライブラリにあります。上記は機能しますが、言語が提供するものを適切に活用していません。最初に変更することはenumerate
、明示的なカウンターではなく使用することです。次に変更することは、write
ではなくファイルのメソッドを使用するprint
ことです。3 つ目に変更することは、「非ゼロは真」ルールを利用することです。 :
my_file = open("thisFile.txt", "r")
out_file = open("thatFile.txt", "w")
for i, line in enumerate(my_file, start=1):
if i % 2:
out_file.write(line)
my_file.close()
out_file.close()
これでうまくいくと言いましたが、実際には何か問題が起きない限りうまくいきます。何か例外がスローされた場合 (たとえば、I/O エラーが発生した場合)、ファイル オブジェクトは閉じられません。1このwith
ステートメントは、例外が発生するかどうかにかかわらず、ファイルが確実に閉じられるように Python に指示します。これは便利なことにタイピングも少なくて済みます。
with open("thisFile.txt", "r") as my_file,
open("thatFile.txt", "w") as out_file:
for i, line in enumerate(my_file, start=1):
if i % 2:
out_file.write(line)
これは Lattyware の回答と同じであることに気付くかもしれません。(Jon Clement の答えは少し巧妙すぎるかもしれません。彼はゴルフをしているように見えます。)
1この単純なコードでは、例外が発生した場合、CPython のガベージ コレクターはファイル オブジェクトにアクセスできなくなったことを認識し、それらを閉じますが、プログラムが複雑になるにつれて、これは当てにならないものになります。