2011-01-13 10 views
0
def getSize(f): 
    print StringIO(f) 
    im = Image.open(StringIO(f)) 
    size = im.size[0], im.size[1] 
    return size 

def download(source_url, g = False, correct_url = True): 
    try: 
     socket.setdefaulttimeout(10) 
     agents = ['Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)','Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)','Microsoft Internet Explorer/4.0b1 (Windows 95)','Opera/8.00 (Windows NT 5.1; U; en)'] 
     ree = urllib2.Request(source_url) 
     ree.add_header('User-Agent',random.choice(agents)) 
     ree.add_header('Accept-encoding', 'gzip') 
     opener = urllib2.build_opener() 
     h = opener.open(ree).read() 
     if g: 
      compressedstream = StringIO(h) 
      gzipper = gzip.GzipFile(fileobj=compressedstream) 
      data = gzipper.read() 
      return data 
     else: 
      return h 
    except Exception, e: 
     return "" 



pic = download("http://media2.ct.yelpcdn.com/photo/2MdauidaMUazuew2h0pdgQ/l") 
s = getSize(pic) 

Когда я делаю это, есть ошибка:Почему мой код python не работает?

print StringIO(f) 
File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1980, in open 
raise IOError("cannot identify image file") 
IOError: cannot identify image file 
+1

Вы просто отбрасывая любые полезные исключения, загрузки() выбросит - Image.open() может пытаться читать «» возвращается путем загрузки(), который может объяснить текущую ошибку вы принимающую , Если вы удалите этот блок try..catch, вы получите более информативные ошибки? – jshu

+0

retagged для удаления тега django - нет зависимости от django здесь – Day

ответ

3

Проблема заключается в том, что ваши Accept-Encoding состояние gzip так что вы, вероятно, получить сжатое изображение.

Я просто попробовал свой код с декомпрессией gzip, и он работает без проблем.

pic = download("http://media2.ct.yelpcdn.com/photo/2MdauidaMUazuew2h0pdgQ/l", g=True) 
    s = getSize(pic) 

Так же меняется ваш 'Accept-Encoding' от 'gzip' к 'image.*'

ree.add_header('User-Agent',random.choice(agents)) 
    ree.add_header('Accept-Encoding', 'image.*') 

Часть 2:

Вы всегда можете попросить gzip и обернуть попытки/за исключением здесь, чтобы вернуть данные не изменяется, если gzip жалуется.

try: 
     compressedstream = StringIO(h) 
     gzipper = gzip.GzipFile(fileobj=compressedstream) 
     data = gzipper.read() 
     return data 
    except IOError: # not gzip 
     return h 
+0

Как изменить функцию загрузки, которая заботится о всех загрузках, без gzip или изображения? – TIMEX

+0

Я полагаю, вы могли бы обернуть функцию gzip в блок try/except, но сервер не должен отправлять вам тип контента, который отсутствует в вашей кодировке accept. Поскольку это звучит крайне маловероятно, если вы хотите это сделать, я бы проверил, будет ли ответ gzipped ПОСЛЕ того, как вы попытаетесь открыть его с помощью PIL. –