shutil.copyfileobj错误地复制了数据

时间:2015-08-21 18:52:55

标签: python

为了处理一些图片(下载,检测格式和存储),我使用以下代码:

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以某种方式搞砸了。为什么会这样?

1 个答案:

答案 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)