2015-08-21 3 views
1

Для того, чтобы работать с какой-то картины (скачать его, обнаружить формат и магазин) Я использую следующий код:shutil.copyfileobj неправильно скопированные данные

image = urllib.request.urlopen(img_url) 
buf = io.BytesIO() 
shutil.copyfileobj(image, buf) 
ext = imghdr.what(buf) 

И вн был пустой (то есть формат не может быть обнаружен) , Я попытался переделать его несколько иначе:

image = urllib.request.urlopen(link) 
test = image.read() 
binbuf = io.BytesIO(test) 
imghdr.what(binbuf) 

И это действительно сработало. Мое заключение заключается в том, что copyfileobj как-то разбирается в вещи. Почему это происходит?

ответ

2

После того, как вы напишите в buf с помощью указателя потока shutil.copyfileobj(image, buf), buf указатель на следующую позицию после окончания данных, которые вы только что написали. Когда вы пытаетесь сделать ext = imghdr.what(buf), он ничего не читает (потому что больше нечего читать с этой позиции) и возвращает None. Вам нужно до .seek() вернуться к 0, прежде чем пытаться прочитать то, что вы только что написали.

Это работает:

image = urllib.request.urlopen(img_url) 
buf = io.BytesIO() 
shutil.copyfileobj(image, buf) 
buf.seek(0) 
ext = imghdr.what(buf)