2

zipfileGoogle Drive. 在那zipfile是一个XML file,我想解析,提取特定信息并将此信息保存在我的本地计算机(或任何地方)上。

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

  1. 通过 Google Drive API (PyDrive) 连接到我的 Google Drive
  2. 获取我的 zipfile id
  3. 将我的 zipfile 加载到内存中
  4. 解压,获取xml文件
  5. 解析 XML,提取所需信息
  6. 在我的本地计算机上将其另存为 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 库读取这个字符串。这个解决方案甚至可能吗?有没有更好的办法?

4

2 回答 2

2

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

这是来自相关 SO帖子的代码:

# 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()))

希望这可以帮助。

于 2017-03-21T08:09:12.340 回答
1

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

toUnzipStringContent = toUnzip.GetContentString(encoding='cp862')
toUnzipBytesContent = BytesIO(toUnzipStringContent.encode('cp862'))
readZipfile = zipfile.ZipFile(toUnzipBytesContent, "r")
于 2017-03-23T10:24:09.503 回答