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 的帮助下)来实现这一点。工作流程如下:
- 通过 Google 驱动器 API (PyDrive)
连接到我的 Google 驱动器
- 获取我的压缩文件 ID
- 将我的 zip 文件加载到内存中
- 解压,得到XML文件
- 解析XML,提取需要的信息
- 在我的本地计算机上将其另存为 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()))
希望对您有所帮助。
最终,我使用BytesIO
和cp862
编码解决了它:
toUnzipStringContent = toUnzip.GetContentString(encoding='cp862')
toUnzipBytesContent = BytesIO(toUnzipStringContent.encode('cp862'))
readZipfile = zipfile.ZipFile(toUnzipBytesContent, "r")
我的 Google Drive
上有一个 zipfile
。其中 zipfile
是一个 XML file
,我想对其进行解析、提取特定信息并将此信息保存在我的本地计算机(或任何地方)上。
我的目标是使用 Python & Google Drive API(在 PyDrive 的帮助下)来实现这一点。工作流程如下:
- 通过 Google 驱动器 API (PyDrive) 连接到我的 Google 驱动器
- 获取我的压缩文件 ID
- 将我的 zip 文件加载到内存中
- 解压,得到XML文件
- 解析XML,提取需要的信息
- 在我的本地计算机上将其另存为 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()))
希望对您有所帮助。
最终,我使用BytesIO
和cp862
编码解决了它:
toUnzipStringContent = toUnzip.GetContentString(encoding='cp862')
toUnzipBytesContent = BytesIO(toUnzipStringContent.encode('cp862'))
readZipfile = zipfile.ZipFile(toUnzipBytesContent, "r")