1

Pythonでのファイルの入力と出力に関係する問題があります(これは、この質問の続きです。データファイルから特定の行を抽出する方法です。これは現在解決されています)。

したがって、1つの大きなファイルdanish.trainと11の小さなファイル(と呼ばれるdanish.test.part-01など)があり、それぞれにファイルからのデータの異なる選択が含まれていdanish.trainます。ここで、11個のファイルのそれぞれについて、それらを補完する付随ファイルを作成したいと思います。つまり、小さなファイルごとに、danish.trainすでに小さなファイルにある部分を差し引いた内容を含むファイルを作成する必要があります。

私がこれまでに思いついたのはこれです:

trainFile = open("danish.train")

for file_number in range(1,12):
    input = open('danish.test.part-%02d' % file_number, 'r')

    for line in trainFile:
        if line not in input:
            with open('danish.train.part-%02d' % file_number, 'a+') as myfile:
                myfile.write(line)

問題は、1から11までのループがありますが、このコードはfile_number1の出力しか提供しないことです。たとえば、範囲をに変更するとin range(2,3)、出力が得られますが、この出力には、必要に応じて、ファイルの内容を省略せずdanish.train.part-02に全体のコピーが含まれています。danish.traindanish.test.part-02

with... asこれらの問題は、オペレーターを完全に理解していない私と関係があるのではないかと思いますが、よくわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

1

ファイルの場合open、ファイルの行を介して反復子を返します。これは、ファイル全体を一度にメモリに保持することなく、一度に 1 行ずつファイルを処理できるという点で便利です。あなたの場合、ファイルを複数回反復処理する必要があるという問題が発生します。

代わりに、完全なトレーニング ファイルをメモリに読み込んで、複数回実行することができます。

with open("danish.train", 'r') as f:
    train_lines = f.readlines()

for file_number in range(1, 12):
    with open("danish.test.part-%02d" % file_number, 'r') as f:
        test_lines = set(f)
    with open("danish.train.part-%02d" % file_number, 'w') as g:
        g.writelines(line for line in train_lines if line not in test_lines)

ロジックも少し単純化しました。行の順序を気にしない場合は、トレーニング行をセットに読み込み、最終行で使用したジェネレーター式の代わりにセット操作を使用することも検討できます。

于 2013-02-06T12:02:08.350 に答える