2010-04-11 11 views
5

Cuando ejecuto el siguiente código, parece que solo está descargando el primer bit del archivo y luego saliendo. Ocasionalmente, obtendré un error 10054, pero generalmente sale sin obtener todo el archivo. Mi conexión a Internet es inalámbrica, y frecuentemente obtengo descargas rotas en archivos más grandes en Firefox, pero mi navegador no tiene problemas para obtener un archivo de imagen de 200k. Soy nuevo en Python, y la programación en general, así que me pregunto qué matiz me estoy perdiendo.¿Por qué no puedo descargar un archivo de imagen completo 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 

Respuesta

10

Para escribir un archivo binario en Windows se necesita explícitamente abierta como binario, es decir .:

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

nota el extra b en las opciones: "wb", no simplemente "w"!

También recomendaría perder el print chunk que puede enviar secuencias binarias arbitrarias a la consola y posiblemente causar efectos secundarios no deseados. Si está interesado en ver a los bytes hexagonales sin sentido, tal vez print repr(chunk), si insiste. Pero encontraría algo más significativo que mostrar, p. len(chunk) y tal vez el número total de bytes hasta el momento.

+0

Gracias. Funciona un regalo ahora. Nunca había notado la diferencia entre "w" y "wb" trabajando con archivos localmente, incluso con imágenes. –

Cuestiones relacionadas