2010-11-28 6 views
2

nicht sicher, wie dies zu erklären, wird jede Hilfe geschätzt werden!Python file.write() zwei Versuche nehmen?

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 

danke!

Antwort

10

Wenn Sie die thumb Datei öffnen, sehen Sie, dass es eine ganze Kopie und eine teilweise Kopie der Daten gibt, die Sie darin schreiben.

Spülen Sie die Datei statt ein zweites Mal zu schreiben.

Die Datei wurde nicht zum ersten Mal geschrieben, da der Inhalt nicht groß genug ist, um den Puffer zu füllen. Der zweite Schreibvorgang überfüllt den Puffer und so werden die Daten eines Puffers geschrieben.

Wie Cameron in seiner Antwort hervorhebt, wird der Puffer beim Schließen der Datei automatisch geleert. Wenn Sie es aus irgendeinem Grund offen halten möchten (und die Tatsache, dass dies ein Problem für Sie zu sein scheint, um anzuzeigen, dass Sie tun), können Sie flush anrufen und die Daten werden sofort geschrieben.

2

Sie haben flush() oder close() nicht auf dem Dateiobjekt aufgerufen, bevor Sie seine Größe auf dem Datenträger überprüfen - es gibt einen internen Puffer, der automatisch gelöscht wird, nachdem eine bestimmte Menge an Daten geschrieben wurde die Festplatte bei vielen Schreibvorgängen).

+0

danke! flush() hat es getan, aber closer() löscht die Datei, ich nehme an, dass es sich um eine temporäre Datei handelt. –

+0

@Aaronasterling: Ja, ich kenne eigentlich nicht die Implementierung von 'tempfile'-Objekten in Python, also habe ich ursprünglich" vielleicht "gesagt - aber natürlich zeigt der gepostete Code die Existenz des besagten Puffers (und es wäre irgendwie verrückt wenn es sowieso keinen Puffer gäbe). 'Schließen' war das erste, was mir einfiel, das den Puffer spülen würde (und dann sah ich deine Antwort, schlug mir auf die Stirn und redigierte). +1 zu deiner Antwort BTW - scheinbar 'close' löscht die temporäre Datei, also nicht die richtige Antwort in diesem Fall :-) – Cameron

Verwandte Themen