为了处理一些图片(下载,检测格式和存储),我使用以下代码:
image = urllib.request.urlopen(img_url)
buf = io.BytesIO()
shutil.copyfileobj(image, buf)
ext = imghdr.what(buf)
并且ext为空(意味着无法检测到格式)。我试着用不同的方式重做它:
image = urllib.request.urlopen(link)
test = image.read()
binbuf = io.BytesIO(test)
imghdr.what(binbuf)
这实际上有效。我的结论是copyfileobj以某种方式搞砸了。为什么会这样?
答案 0 :(得分: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)