Почему мой код на Python не работает? - PullRequest
0 голосов
/ 13 января 2011
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)

Когда я это делаю, возникает ошибка:

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 Ответ

3 голосов
/ 13 января 2011

Проблема в том, что ваше 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
...