2010-04-11 9 views
5

Po uruchomieniu następującego kodu, wydaje się, że pobiera on tylko pierwszy mały fragment pliku, a następnie kończy pracę. Czasami otrzymam komunikat o błędzie 10054, ale zwykle po prostu wychodzi bez pobierania całego pliku. Moje połączenie z internetem jest brzydko bezprzewodowe i często dostaję zepsute pliki do pobrania na większe pliki w Firefoksie, ale moja przeglądarka nie ma problemu z uzyskaniem pliku obrazu o rozdzielczości 200k. Jestem nowy w python i programowaniu w ogóle, więc zastanawiam się, jakiego niuansu brakuje mi.Dlaczego nie mogę pobrać całego pliku obrazu za pomocą 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 

Odpowiedz

10

Aby zapisać plik binarny w systemie Windows trzeba wyraźnie otwarty go jako binarne, tj .:

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

uwaga dodatkowa b w opcjach: "wb", nie tylko "w"!

Polecam również utratę print chunk, która może wysyłać arbitralne sekwencje binarne do konsoli i prawdopodobnie powodować niepożądane efekty uboczne. Jeśli chcesz zobaczyć bajty szesnastkowe bezsensownie, być może print repr(chunk), jeśli nalegasz. Ale znajdę coś bardziej znaczącego do pokazania, np. len(chunk) i być może całkowita liczba bajtów do tej pory.

+0

Dzięki. Działa teraz. Nigdy nie zauważyłem różnicy między "w" i "wb", gdy pracuję z plikami lokalnie, nawet z obrazami. –

Powiązane problemy