Python:从 Google Drive API 获取 zip 文件并加载其内容

Posted

技术标签:

【中文标题】Python:从 Google Drive API 获取 zip 文件并加载其内容【英文标题】:Python: Get zip file from Google Drive API and load its content 【发布时间】:2017-03-20 13:06:45 【问题描述】:

我的Google Drive 上有一个zipfile。其中zipfileXML file,我想对其进行解析、提取特定信息并将此信息保存在我的本地计算机(或任何地方)上。

我的目标是使用 Python 和 Google Drive API(在 PyDrive 的帮助下)来实现这一点。工作流程可能如下:

    通过 Google Drive API (PyDrive) 连接到我的 Google Drive 获取我的 zipfile id 将我的 zipfile 加载到内存中 解压,获取XML文件 解析 XML,提取所需信息 在我的本地计算机上将其保存为 csv

现在,我可以执行步骤 1、2、4、5、6。但是我不知道如何将 zipfile 加载到内存中而不先将其写入本地硬盘。

以下 PyDrive 代码将获取 zipfile 并将其放在我的本地 HDD 上,这不是我想要的。

toUnzip = drive.CreateFile('id':'MY_FILE_ID')
toUnzip.GetContentFile('zipstuff.zip')

我猜一种解决方案可能如下:

我可以将 zipfile 读取为带有某种编码的字符串:

toUnzip = drive.CreateFile('id':'MY_FILE_ID')
zipAsString = toUnzip.GetContentString(encoding='??')

然后,我可以以某种方式(不知道如何,也许StringIO 可能有用)使用 Python zipfile 库读取此字符串。这个解决方案甚至可能吗?有没有更好的办法?

【问题讨论】:

【参考方案1】:

你可以试试StringIO,它们模拟文件但驻留在内存中。

这是来自相关 SO post 的代码:

# get_zip_data() gets a zip archive containing 'foo.txt', reading 'hey, foo'

from StringIO import StringIO
zipdata = StringIO()
zipdata.write(get_zip_data())
myzipfile = zipfile.ZipFile(zipdata)
foofile = myzipfile.open('foo.txt')
print foofile.read()

# output: "hey, foo" 

或使用URL

url = urlopen("http://www.test.com/file.zip")
zipfile = ZipFile(StringIO(url.read()))

希望这会有所帮助。

【讨论】:

非常感谢您的回答和启发。我最终用 BytesIO 和特殊编码解决了。【参考方案2】:

最终,我使用BytesIOcp862编码解决了这个问题:

toUnzipStringContent = toUnzip.GetContentString(encoding='cp862')
toUnzipBytesContent = BytesIO(toUnzipStringContent.encode('cp862'))
readZipfile = zipfile.ZipFile(toUnzipBytesContent, "r")

【讨论】:

以上是关于Python:从 Google Drive API 获取 zip 文件并加载其内容的主要内容,如果未能解决你的问题,请参考以下文章

通过 Google Drive API 从本地 CSV 文件创建 Google Drive 电子表格

Google Drive API Python 服务帐户示例

Google Drive API v3 Python文件中缺少某些文件()。list()

2小时后Google Drive Python API可恢复上传错误401

使用 REST api 从 Google Drive 下载图片

无法从Google Drive API检索文件内容