Python:ファイルreadline()操作を元に戻すため、ファイルポインターが元の状態に戻ってきます
質問
特別な行を探しているfile.readline()を使用して、読み取り専用モードのテキストファイルのPythonファイルポインターを閲覧しています。その行を見つけたら、ファイルポインターがその読み取りラインの開始時にあることを期待しているメソッドにファイルポインターを渡したい(その直後ではない)。
ファイルポインターで1つのfile.readline()操作を本質的に元に戻すにはどうすればよいですか?
解決
呼び出して位置を覚えておく必要があります file.tell()
readlineの前に、次に呼び出します file.seek()
巻き戻す。何かのようなもの:
fp = open('myfile')
last_pos = fp.tell()
line = fp.readline()
while line != '':
if line == 'SPECIAL':
fp.seek(last_pos)
other_function(fp)
break
last_pos = fp.tell()
line = fp.readline()
電話しても安全かどうかは思い出せません file.seek()
Aの内側 for line in file
ループして、私は通常、それを書き出すだけです while
ループ。これを行うには、おそらくはるかに多くのpythonic方法があります。
他のヒント
ラインの出発点を記録します thefile.tell()
電話する前に readline
, 、そして、あなたがする必要がある場合、その点に戻り、 thefile.seek
.
>>> with open('bah.txt', 'w') as f:
... f.writelines('Hello %s\n' % i for i in range(5))
...
>>> with open('bah.txt') as f:
... f.readline()
... x = f.tell()
... f.readline()
... f.seek(x)
... f.readline()
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
ご覧のとおり、Seek/Tell「ペア」は「元に戻す」ことです。 readline
. 。もちろん、これは実際のシーク可能な(すなわち、ディスク)ファイルでのみ機能し、ソケットなどのメイクファイル法で構築されたファイルのようなオブジェクトではなく(例えば)。
あなたの方法が単にファイルを繰り返したい場合は、使用することができます itertools.chain
適切なイテレーターを作成するには:
import itertools
def process(it):
for line in it:
print line,
with open(filename,'r') as f:
for line in f:
if 'marker' in line:
it=itertools.chain((line,),f)
process(it)
break
fin = open('myfile')
for l in fin:
if l == 'myspecialline':
# Move the pointer back to the beginning of this line
fin.seek(fin.tell() - len(l))
break
# now fin points to the start of your special line
最後の行がわからない場合は、訪問しなかったため、新しいラインキャラクターが表示されるまで後方に読むことができます。
with open(logfile, 'r') as f:
# go to EOF
f.seek(0, os.SEEK_END)
nlines = f.tell()
i=0
while True:
f.seek(nlines-i)
char = f.read(1)
if char=='\n':
break
i+=1