2010-04-11 16 views
5

Quando eseguo il seguente codice, sembra che stia scaricando solo il primo pezzetto di file e quindi esco. Occasionalmente, otterrò un errore 10054, ma di solito esce solo senza ottenere l'intero file. La mia connessione Internet è crappy wireless, e spesso mi vengono scaricati download su file più grandi in firefox, ma il mio browser non ha problemi a ottenere un file immagine da 200k. Sono nuovo di Python, e la programmazione in generale, quindi mi chiedo quale sfumatura mi manca.Perché non riesco a scaricare un intero file di immagine con urllib2.urlopen()

import urllib2 
xkcdpic=urllib2.urlopen("http://imgs.xkcd.com/comics/literally.png") 
xkcdpicfile=open("C:\\Documents and Settings\\John Gann\\Desktop\\xkcd.png","w") 
while 1: 
    chunk=xkcdpic.read(4028) 
    if chunk: 
     print chunk 
     xkcdpicfile.write(chunk) 
    else: 
     break 

risposta

10

Per scrivere un file binario su Windows è necessario in modo esplicito aperta come binario, cioè .:

xkcdpicfile=open("C:\\Documents and Settings\\John Gann\\Desktop\\xkcd.png", 
       "wb") 

nota l'extra b nelle opzioni: "wb", non solo "w"!

Vorrei anche raccomandare di perdere print chunk che potrebbe inviare sequenze binarie arbitrarie alla console e causare effetti collaterali indesiderati. Se ti interessa vedere i byte esagonali sfrecciare senza significato, forse print repr(chunk), se insisti. Ma troverei qualcosa di più significativo da mostrare, ad es. len(chunk) e forse il numero totale di byte finora.

+0

Grazie. Funziona a meraviglia ora. Non ho mai notato una differenza tra "w" e "wb" che lavorano con i file localmente, anche con le immagini. –

Problemi correlati