2010-11-28 10 views
2

これを説明する方法がわからない場合は、何か助けていただければ幸いです!Python file.write()は2回試行しますか?

Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import urllib2, pynotify, tempfile, os 
>>> opener = urllib2.build_opener() 
>>> page = opener.open('http://img.youtube.com/vi/RLGJU_xUVTs/1.jpg') 
>>> thumb = page.read() 
>>> temp = tempfile.NamedTemporaryFile(suffix='.jpg') 
>>> temp.write(thumb) 
>>> os.path.getsize(temp.name) 
0 
>>> temp.write(thumb) 
>>> os.path.getsize(temp.name) 
4096 

ありがとうございます!

答えて

10

thumbファイルを開くと、1つのコピー全体と、そこに書き込んでいるデータの部分コピーがあることがわかります。

2回目の書き込みではなく、ファイルをフラッシュします。

temp.flush() 

内容がバッファを満たすのに十分でないため、ファイルの書き込みが初めてではありませんでした。 2回目の書き込みでバッファがオーバーフィルされ、バッファのデータが書き込まれます。

キャメロンが答えて指摘したように、ファイルを閉じるとバッファは自動的にフラッシュされます。なんらかの理由でそれを開いたままにしたい場合(そして、これが問題であると思われる場合)、flushに電話をかけるとデータがすぐに書き込まれます。

2

ディスクオブジェクトのサイズを確認する前に、ファイルオブジェクトにflush()またはclose()を呼び出していない - 一定量のデータが書き込まれた後に自動的にフラッシュされる内部バッファがある(これにより高価なトリップ多くの書き込みを行っているときのディスク)。

+0

ありがとうございます! flush()はそれを行っていますが、close()を呼び出すとファイルが削除されますが、私はb/cと仮定しています。 –

+0

@aaronasterling:ええ、私は実際にはPythonで 'tempfile'オブジェクトの実装を知っていないので、もともと"多分 "と言っていましたが、もちろんポストされたコードはバッファの存在を示しています(そして、とにかくバッファーがなければ)。バッファーを洗い流すのが私に起こった最初のことでした(そして私はあなたの答えを見て、私の額を叩いて編集しました)。 +1あなたの答えBTW - 明らかに 'close'は一時ファイルを削除するので、この場合は正しい答えではありません:-) – Cameron

関連する問題