如何使用 Python 下载 Google 驱动器上的目录?
How to Download a directory on Google Drive using Python?
service = self.auth()
items = self.listFilesInFolder(downLoadFolderKey)
for item in items:
file_id = (item.get('id'))
file_name = (item.get('name'))
request = service.files().get_media(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print ("Download %d%%." % int(status.progress() * 100) + file_name)
filepath = fileDownPath + file_name
with io.open(filepath, 'wb') as f:
fh.seek(0)
f.write(fh.read())
我正在使用 Google Drive API v3。
我正在尝试下载完整目录。但问题是目录本身包含文件夹,当我尝试 运行 这段代码时。发生此错误。
<HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/1ssF0XD8pi6oh6DXB1prIJPWKMz9dggm2?alt=media returned "Only files with binary content can be downloaded. Use Export with Google Docs files.">
我认为错误是由于它试图下载目录中的文件夹。但是如何下载完整目录?
P.S 目录发生变化,因此我无法对文件 ID 进行硬编码,然后再下载文件。
我相信你的情况和目标如下。
- 通过
items = self.listFilesInFolder(downLoadFolderKey)
,您已经能够检索所有文件和文件夹列表,包括特定文件夹下的子文件夹。
items
包括每个文件和文件夹的 mimeType。
- 在你的问题中,在循环中使用文件夹时,出现错误。
- 您想删除这个错误。
为此,这个答案怎么样?
修改点:
- 当mimeType包含在
items = self.listFilesInFolder(downLoadFolderKey)
的items
中时,可以通过mimeType检查文件夹。文件夹的 mimeType 是 application/vnd.google-apps.folder
.
- 从你的脚本来看,我认为当使用“Files:get”方法下载Google Docs文件(Spreadsheet、Document、Slides等)时,也会出现同样的错误。
- 要下载Google Docs文件,需要使用“文件:导出”的方法。
当上面的点反映到你的脚本中时,下面的修改怎么样?
修改后的脚本:
从:
request = service.files().get_media(fileId=file_id)
到:
file_mimeType = (item.get('mimeType'))
if file_mimeType == 'application/vnd.google-apps.folder':
continue
request = service.files().export_media(fileId=file_id, mimeType='application/pdf') if 'application/vnd.google-apps' in file_mimeType else service.files().get_media(fileId=file_id)
- 本次修改,首先请确认是否包含
items = self.listFilesInFolder(downLoadFolderKey)
的items
文件mimeType,再。这样,可以跳过该文件夹,并且可以使用 mimeType 的值下载 Google Docs 文件和除 Google Docs 之外的文件。
- 在此修改中,作为示例修改,Google Docs 文件下载为 PDF 文件。如果要更改输出mimeType,请修改
mimeType='application/pdf'
.
参考文献:
service = self.auth()
items = self.listFilesInFolder(downLoadFolderKey)
for item in items:
file_id = (item.get('id'))
file_name = (item.get('name'))
request = service.files().get_media(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print ("Download %d%%." % int(status.progress() * 100) + file_name)
filepath = fileDownPath + file_name
with io.open(filepath, 'wb') as f:
fh.seek(0)
f.write(fh.read())
我正在使用 Google Drive API v3。 我正在尝试下载完整目录。但问题是目录本身包含文件夹,当我尝试 运行 这段代码时。发生此错误。
<HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/1ssF0XD8pi6oh6DXB1prIJPWKMz9dggm2?alt=media returned "Only files with binary content can be downloaded. Use Export with Google Docs files.">
我认为错误是由于它试图下载目录中的文件夹。但是如何下载完整目录?
P.S 目录发生变化,因此我无法对文件 ID 进行硬编码,然后再下载文件。
我相信你的情况和目标如下。
- 通过
items = self.listFilesInFolder(downLoadFolderKey)
,您已经能够检索所有文件和文件夹列表,包括特定文件夹下的子文件夹。 items
包括每个文件和文件夹的 mimeType。- 在你的问题中,在循环中使用文件夹时,出现错误。
- 您想删除这个错误。
为此,这个答案怎么样?
修改点:
- 当mimeType包含在
items = self.listFilesInFolder(downLoadFolderKey)
的items
中时,可以通过mimeType检查文件夹。文件夹的 mimeType 是application/vnd.google-apps.folder
. - 从你的脚本来看,我认为当使用“Files:get”方法下载Google Docs文件(Spreadsheet、Document、Slides等)时,也会出现同样的错误。
- 要下载Google Docs文件,需要使用“文件:导出”的方法。
当上面的点反映到你的脚本中时,下面的修改怎么样?
修改后的脚本:
从:request = service.files().get_media(fileId=file_id)
到:
file_mimeType = (item.get('mimeType'))
if file_mimeType == 'application/vnd.google-apps.folder':
continue
request = service.files().export_media(fileId=file_id, mimeType='application/pdf') if 'application/vnd.google-apps' in file_mimeType else service.files().get_media(fileId=file_id)
- 本次修改,首先请确认是否包含
items = self.listFilesInFolder(downLoadFolderKey)
的items
文件mimeType,再。这样,可以跳过该文件夹,并且可以使用 mimeType 的值下载 Google Docs 文件和除 Google Docs 之外的文件。 - 在此修改中,作为示例修改,Google Docs 文件下载为 PDF 文件。如果要更改输出mimeType,请修改
mimeType='application/pdf'
.