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

时间:2017-03-20 13:06:46

标签: python google-api google-drive-api google-api-python-client pydrive

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

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

  1. 通过Google Drive API(PyDrive)连接到我的Google云端硬盘
  2. 获取我的zipfile id
  3. 将我的zip文件加载到内存
  4. 解压缩,获取XML文件
  5. 解析XML,提取所需信息
  6. 将其保存为本地计算机上的csv
  7. 现在,我能够执行步骤1,2,4,5,6。但我不知道如何将zipfile加载到内存中而不先将其写入本地硬盘。

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

    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库读取这个字符串。这个解决方案是否可行?有没有更好的办法?

2 个答案:

答案 0 :(得分:1)

您可以尝试StringIO,他们会模拟文件,但会驻留在内存中。

以下是相关SO post的代码:

AFTER UPDATE

或使用# 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

希望这有帮助。

答案 1 :(得分:0)

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

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