为了处理一些图片(下载、检测格式和存储),我使用以下代码:
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 以某种方式搞砸了。为什么会这样?
最佳答案
用shutil.copyfileobj(image, buf)
写入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)
关于python - shutil.copyfileobj 错误地复制了数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32147491/