16

一度に各行を取得したいファイルがありますが、特定の行に到達したら、次の数行の情報を取得する必要があります。

コードサンプルは次のとおりです。

rofile = open('foo.txt', 'r')
for line in rofile:
    print line
    if(line.strip() == 'foo'):
        line = line.next()
        print line
        line = line.next()
        print line
        line = line.next()
        print line

戻って 2 回目のループを実行すると、最初の print ステートメントによってファイルの 5 行目が出力されるはずです。これを行う方法はありますか?

編集:詳細を明確にしておらず申し訳ありません。rofile私が反復しているファイルオブジェクトです。ファイルを使用するときに次の行を取得する実際の方法であるかどうかnext()はわかりません。Pythonでのファイル操作の経験はあまりありません。

4

5 に答える 5

15

を使用iterして、オブジェクトをサポートする iterable に変換できますnext

irofile = iter(rofile)
for line in irofile:
    print line
    if(line == 'foo'):
        line = next(irofile)  #BEWARE, This could raise StopIteration!
        print line

コメントで指摘されているように、オブジェクトが既にイテレータである場合は、心配する必要はありませんiter(これはfileオブジェクトの場合です)。ただし、任意の iterable ( lists など) の場合に機能するため、ここに残します。

于 2012-11-26T19:53:21.893 に答える
2

オブジェクトのタイプに応じて、rofileこれを行う方法がいくつか考えられます。

文字列のリスト

ファイルの行を構成する単なる文字列のリストにすることができる場合:

for index, line in enumerate(rofile):
   if line == 'foo':
       for a in range(index, index + HOW_MANY_LINES_YOU_WANT):
           print rofile[a]

反復可能

ファイルが既に iterable の場合:

for line in rofile:
    print line
    if line == 'foo':
        for a in range(3): # Just do it 3 times
            print line.next()
            # After this happens and the for loop is restarted,
            # it will print the line AFTER

私が書いたこの急ごしらえの例では、反復可能オブジェクトとしてこのように機能することがわかります。

>>> k = iter([1,2,3,4])
>>> for a in k:
    print 'start loop'
    print a
    if a == 2:
        print 'in if'
        print k.next()
        print 'end if'
    print 'end loop'


start loop
1
end loop
start loop
2
in if
3
end if
end loop
start loop
4
end loop
于 2012-11-26T20:04:59.990 に答える
1

実際にすべての行に対して何かforしたくない場合は、ループを使用しないでください。1つのオプションは次のとおりです。

try:
    while True:
        line = file.next()
        #do stuff
        if line == 'foo':
            #do other stuff
except(StopIteration):
     #go on with your life
于 2012-11-26T20:07:05.760 に答える
0

ファイルオブジェクトに対してそれを行う簡単な方法は次のとおりです。

with open('foo.txt', 'r') as rofile:
    for line in rofile:
        print line,
        if line.strip() == 'foo':
            for _ in xrange(3):  # get the next 3 lines
                try:
                    line = rofile.next()
                except StopIteration:
                    break
                print line,

「foo」行が表示された後、さらに 3 行がない場合は、try/except が必要です。

于 2012-11-26T23:28:23.343 に答える
0

同様の問題があり、continue代わりにステートメントを使用すると私の場合はうまくいきました

于 2016-11-03T10:20:32.720 に答える