1

Pythonプログラミングについて質問です。

次のような参照ファイル(ref.txt)がある場合

3
5
6

これらの文字列を 5 回したい場合のような出力ファイルを作成したい

3
5
6
3
5
6
3
5
6
3
5
6
3
5
6

合計 15 行。

私は次のようなコードを考えました

with open('ref.txt') as f1, open('out.txt', 'w') as f2:
     for i in range(1, 6):
           for line in f1:
               value=line.split()
               line=' '.join(value) + '\n'

               f2.write(line)

このコードは、元の値を出力するだけです。参照値の複数の繰り返し行を印刷するにはどうすればよいですか。

ありがとう。

4

2 に答える 2

4
repeat = ""
with open('ref.txt') as f1:
    for line in f1:
        repeat = "".join([repeat, line])
with open('out.txt', 'w') as f2:
    f2.write(repeat*5)
于 2013-07-31T17:24:55.370 に答える
2

Stephan's answer はこれを行う方法を説明していますが、あなたの試みの何が問題なのかを説明していません:

with open('ref.txt') as f1, open('out.txt', 'w') as f2:
     for i in range(1, 6):
           for line in f1:
               value=line.split()
               line=' '.join(value) + '\n'

               f2.write(line)

range(1, 6)値が 5 つしかないという小さな問題があります (printそれを見て確認してください)。あなたはrange(6)ここに欲しい。

しかし、ここでの主な問題は、一度しか開いていないのにref.txt、それを繰り返し反復しようとしていることです。ファイルやその他の種類のイテレータではできません。イテレータを反復すると、イテレータのポイント全体が「使い果たされ」ます。

これには、次の 4 つの基本的な解決策があります。


イテレータを「リセット」する方法がある場合は、ループのたびにそれを行うことができます。ほとんどのイテレータはそれができませんが、ファイルは次のようにできますseek:

with open('ref.txt') as f1, open('out.txt', 'w') as f2:
    for i in range(6):
        for line in f1:
            value=line.split()
            line=' '.join(value) + '\n'
            f2.write(line)
        f1.seek(0)

あるいは、ループを通過するたびに新しいきれいなイテレータを(十分に安価に)取得できる場合は、それを行うことができます。この場合、毎回ファイルを開くことを意味します。

with open('out.txt', 'w') as f2:
    for i in range(6):
        with open('ref.txt') as f1:
            for line in f1:
                value=line.split()
                line=' '.join(value) + '\n'
                f2.write(line)

あるいは、場合によってlistは、イテレータを取得した再利用可能な iterable ( のような) が周りにあり、イテレータの代わりにそれを使用することができます。しかし、それはここでは当てはまりません。


最後に、値を、または文字列などの他の繰り返し可能な型に格納することで、再利用可能な iterableを作成できます。list例えば:

with open('ref.txt') as f1:
    lines = list(f1)
with open('out.txt', 'w') as f2:
    for i in range(6):
        for line in lines:
            value=line.split()
            line=' '.join(value) + '\n'
            f2.write(line)

処理の一部またはすべてを最初のブロックに移動したい場合があるため、6 回続けて実行することはありません。例えば:

with open('ref.txt') as f1:
    lines = [' '.join(line.split()) + '\n' for line in f1]
with open('out.txt', 'w') as f2:
    for i in range(6):
        for line in lines:
            f2.write(line)

それを取得したら、さらに改善できます。

with open('ref.txt') as f1:
    lines = [' '.join(line.split()) + '\n' for line in f1]
data = ''.join(lines)
with open('out.txt', 'w') as f2:
    for i in range(6):
        f2.write(data)

そしてさらに:

with open('ref.txt') as f1:
    lines = [' '.join(line.split()) + '\n' for line in f1]
data = ''.join(lines)
with open('out.txt', 'w') as f2:
    f2.write(data * 6)
于 2013-07-31T18:02:55.357 に答える