0

一部のデータをスクレイピングするためにスクレイピーを使用しています。私は2つのクモを手に入れました=クモaとb

スパイダー a は、データを取得してファイルに書き込みます。スパイダー b はそのデータを読み取ります。

問題は、スパイダー b が空のファイルを取得することです。

クモが仕事を終えた後、ファイルがいっぱいになっていることがわかります。

これを理解するのに数時間を費やしました。

コードスニペット:

クモ

f = open('file.txt', 'a+')
f.write("str")
f.write("\n")
f.close()

クモ b

f = open('file.txt')
for line in f:
  print line
f.close()

何も出てこない、これの何が悪いの?

編集:私はそれを働かせました。「a」でファイルを開き、行を書き、ファイルを閉じます。これはすべての行に当てはまります。

コード スニペットが改訂されました。

4

2 に答える 2

1

(1) 「スパイダーb」でf.close()代わりにしたい。f.close現在の方法では、ファイルを適切に閉じていないため、そのバッファーはフラッシュされていません。

また、「スパイダー a」でのf.flush()の使用に関しては、ドキュメントから次の注意事項を認識していることを確認してください。

注意 flush() は必ずしもファイルのデータをディスクに書き込みません。この動作を保証するには、 flush()の後にos.fsync()を使用 します。

実際、よほどの理由がない限り、ファイルだけの方がよいかもしれませんclose()。フラッシュしたい場合は、必ずos.sfsync()も使用してください。

(2) また、代わりに

for line in f:
   print f

これを試して:

for line in f:
   print line

最後に、使用withして開いているファイルを管理する方法を見てみましょう。例えば

with open('file.txt') as f:
   # put file related actions here
   for line in f:
      print line

ブロックの最後で、または例外が発生した場合に、ファイルを自動的に閉じます。

于 2012-07-19T18:29:06.937 に答える
0

f.close()と で作成した 2 つのタイプミスを除いて、この例には問題はありませんprint line。私の推測では、実際のコードでは、b のファイルを反復処理し、a がさらにデータを追加するのを待ってから、b が対話を続行しようとします。あなたはそれをすることはできません。イテレータが最後に達した場合、再開できません。これを回避する最も簡単な方法は、f.readline() を使用してコードを書き直すことです。

while True:
    line = f.readline()
    if not line:
        break
    print line
于 2012-07-19T18:54:57.473 に答える