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

Python: Get zip file from Google Drive API and load its content

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

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

  1. 通过 Google 驱动器 API (PyDrive)
  2. 连接到我的 Google 驱动器
  3. 获取我的压缩文件 ID
  4. 将我的 zip 文件加载到内存中
  5. 解压,得到XML文件
  6. 解析XML,提取需要的信息
  7. 在我的本地计算机上将其另存为 csv

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

以下 PyDrive 代码将获取 zip 文件并将其放在我的本地硬盘上,这不是我想要的。

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

我想一种解决方案如下:

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

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

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

您可以尝试 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()))

希望对您有所帮助。

最终,我使用BytesIOcp862编码解决了它:

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