-1

あるファイルから行を読み取り、そのファイルから 1 行おきに別のファイルに出力するように求められます。これは私がこれまでに持っているものです。

my_file = open("thisFile.txt", "r")
out_file = open("thatFile.txt", "w")

for line in my_file:
    line = int(line)
    if line%2 !=0:
        print(line,file=out_file)     

my_file.close()
out_file.close()
4

3 に答える 3

4
from itertools import islice

with open('input') as fin, open('output', 'w') as fout:
    fout.writelines(islice(fin, None, None, 2)
于 2013-02-18T00:54:41.977 に答える
1

これは比較的単純なタスクです - あなたの主な問題はの使用ですint()- 行全体を数値に変換しようとしていますが、失敗しています。あなたがしたいことは、あなたがいる回線の番号を追跡することです。これを行う最も簡単な方法はenumerate()ビルトインを使用することです。

with open("thisFile.txt") as in_file, open("thatFile.txt") as out_file:
    for line_no, line in enumerate(in_file, start=1):
        if line_no % 2:
            out_file.write(line)

ここでもステートメントの使用に注意してください。withこれにより、ファイルが自動的に閉じられ、例外が発生した場合でも閉じられます。使用することをお勧めします。また、読みやすさも大幅に向上しています。

于 2013-02-18T00:54:01.773 に答える
0

新しい概念を持ち込まずに、プログラムに必要なことを実行させるための最小限の変更は次のとおりです。

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 のガベージ コレクターファイル オブジェクトにアクセスできなくなったことを認識し、それらを閉じますが、プログラムが複雑になるにつれて、これは当てにならないものになります。

于 2013-02-18T01:12:54.227 に答える