太平船务无法识别流式传输到io的Google云端硬盘图片的图像文件.字节IO



我正在使用云端硬盘 API 下载图像。在他们的 Python 文件下载文档之后,我最终得到了一个变量fh,它是一个填充的io.BytesIO实例。我尝试将其另存为图像:

file_id = "0BwyLGoHzn5uIOHVycFZpSEwycnViUjFYQXR5Nnp6QjBrLXJR"
request = service.files().get_media(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print('Download {} {}%.'.format(file['name'],
                                    int(status.progress() * 100)))
    fh.seek(0)
image = Image.open(fh) # error

错误是:cannot identify image file <_io.BytesIO object at 0x106cba890> 。实际上,该错误不会发生在另一张图像上,而是在大多数图像中抛出,包括我在本文开头链接的图像。

阅读此答案后,我将最后一行更改为:

byteImg = fh.read()
dataBytesIO = io.BytesIO(byteImg)
image = Image.open(dataBytesIO) # still the same error

我也尝试过这个答案,我将第一个代码块的最后一行更改为

byteImg = fh.read()
image = Image.open(StringIO(byteImg))

但我仍然收到一个cannot identify image file <StringIO.StringIO instance at 0x106471e60>错误。

我尝试使用替代(请求,urllib(但没有结果。如果我手动下载图像,我可以Image.open图像。

此错误在一个月前不存在,最近已弹出到此代码所在的应用程序中。我花了几天时间调试此错误,但没有成功,最终将问题带到了堆栈溢出。我正在使用from PIL import Image.

放弃云端硬盘服务的MediaIOBaseDownload。请改用媒体文件的 webContentLink 属性(用于在浏览器中下载文件内容的链接,仅适用于包含二进制内容的文件(。在此处阅读更多内容。

通过该内容链接,我们可以使用另一种形式的流式传输 - requestsshutil库以及 - 来获取图像。

import requests
import shutil
r = requests.get(file['webContentLink'], stream=True)
with open('output_file', 'wb') as f:
    shutil.copyfileobj(r.raw, f)

相关内容

  • 没有找到相关文章

最新更新