57

ファイルの反復処理に問題があります。インタープリターに入力した内容と結果は次のとおりです。

>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
...  print(line)
... 
# ... all the lines from the file appear here ...

同じ開いているファイルを再度処理しようとすると、何も得られません!

>>> for line in f.readlines():
...  print(line)
... 
>>>

出力はまったくありません。これを解決するにはclose()、ファイルを開き、再度開く必要があります。それは正常な動作ですか?

4

4 に答える 4

89

はい、それは正常な動作です。基本的に、最初はファイルの最後まで読み取るため (テープを読み取るようにイメージできます)、ファイルをリセットしない限り、それ以上読み取ることはできませんf.seek(0)。ファイルを閉じるか、ファイルを閉じてからもう一度開き、ファイルの先頭から開始します。

with必要に応じて、ファイルを自動的に閉じる構文を代わりに使用できます。

例えば、

with open('baby1990.html', 'rU') as f:
  for line in f:
     print line

このブロックの実行が完了すると、ファイルは自動的に閉じられるため、ファイルを自分で明示的に閉じずにこのブロックを繰り返し実行し、この方法でファイルをもう一度読み取ることができます。

于 2012-04-21T01:02:59.937 に答える
17

ファイルオブジェクトはファイルを読み取るときに、ポインタを使用してファイルの場所を追跡します。ファイルの一部を読んだら、後で戻って、中断したところから再開します。ファイル全体を読み取り、同じファイルオブジェクトに戻ると、ポインタがファイルの最後にあり、読み取るものが何もないため、空のファイルを読み取るようなものになります。を使用file.tell()して、ファイル内のどこにポインターがあるかを確認し、ポインターfile.seekを設定できます。例えば:

>>> file = open('myfile.txt')
>>> file.tell()
0
>>> file.readline()
'one\n'
>>> file.tell()
4L
>>> file.readline()
'2\n'
>>> file.tell()
6L
>>> file.seek(4)
>>> file.readline()
'2\n'

file.readlines()また、ファイル全体を読み取り、リストとして保存することを知っておく必要があります。次のものを置き換えることができるので、知っておくと便利です。

for line in file.readlines():
    #do stuff
file.seek(0)
for line in file.readlines():
    #do more stuff

と:

lines = file.readlines()
for each_line in lines:
    #do stuff
for each_line in lines:
    #do more stuff

次の手順を実行することで、ファイル全体をメモリに保持せずに、一度に1行ずつファイルを反復処理することもできます(これは非常に大きなファイルの場合に非常に便利です)。

for line in file:
    #do stuff
于 2012-04-21T01:05:29.907 に答える
9

ファイルオブジェクトはバッファです。バッファから読み取ると、読み取った部分が消費されます(読み取り位置が前方にシフトされます)。ファイル全体を読み取る場合、読み取り位置はファイルの終わり(EOF)にあるため、読み取るものが残っていないため、何も返されません。

何らかの理由でファイルオブジェクトの読み取り位置をリセットする必要がある場合は、次の操作を実行できます。

f.seek(0)
于 2012-04-21T01:04:34.037 に答える
-1

もちろん。それは正常で正気な行動です。ファイルを閉じて再度開く代わりにrewind、ファイルを閉じることができます。

于 2012-04-21T01:02:36.717 に答える