使用 Google 驱动器 API 创建嵌套文件夹

Create nested folders with Google Drive API

我需要使用 Google Drive api 在 Google 驱动器上的嵌套文件夹中添加一个新文件,格式为 YYYY/MM/DD/HH/mm/file,其中日期是根据当前日期动态创建的。 例如:

2021/06/16/11/30/my_file.csv

我在 Python 中创建了以下脚本,但它创建的是一个文件夹(名为“2021/06/16/11/30”)而不是所需的嵌套结构(多个嵌套文件夹名为“ 06"、"11" 和 "30") 在父文件夹“2021”中:

from googleapiclient.discovery import build
import google.auth
from googleapiclient.http import MediaFileUpload

SCOPES = ['https://www.googleapis.com/auth/drive.metadata', 'https://www.googleapis.com/auth/drive']

credentials, project_id = google.auth.default(scopes=SCOPES)
service = build('drive', 'v3', credentials=credentials)

folder_id = 'parent-folder-id'

# Create folder
file_metadata = {
    'name': '2021/06/16/11/30',
    'mimeType': 'application/vnd.google-apps.folder',
    'parents': [folder_id],
}
file = service.files().create(body=file_metadata, fields='id').execute()
new_folder_id = file.get('id')
print(f'Folder ID: {new_folder_id}')

# Upload file
file_metadata = {
    'name': 'my_file.csv',
    'parents': [new_folder_id],
}
media = MediaFileUpload('my_file.csv', mimetype='text/csv', resumable=True)
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f'Folder ID: {file.get("id")}')

有没有一种方法可以在一次调用中创建这样的嵌套文件夹结构,而不是在每次创建文件夹时进行迭代并将新文件夹 ID 作为新父 ID 传递?

files.createAPI只创建一个文件,不能一次调用创建多个文件。所以要回答你的问题,需要先创建2021,将新创建的文件夹ID设置为父文件夹,然后迭代文件夹创建(06、16等),直到到达最底层。

示例:

folder_id = 'parent-folder-id'

date_array = ["2021", "06", "16", "11", "30"]

for x in date_array:
  # Create folder
  file_metadata = {
      'name': x,
      'mimeType': 'application/vnd.google-apps.folder',
      'parents': [folder_id],
  }
  file = service.files().create(body=file_metadata, fields='id').execute()
  new_folder_id = file.get('id')
  print(f'Folder ID: {new_folder_id}')
  folder_id = new_folder_id

# Upload file
file_metadata = {
    'name': 'my_file.csv',
    'parents': [folder_id],
}
media = MediaFileUpload('my_file.csv', mimetype='text/csv', resumable=True)
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f'Folder ID: {file.get("id")}')

修改点:

  • 在Google驱动器中,每个文件和文件夹都由唯一的ID而不是文件名和文件夹名来管理。在这种情况下,当my_file.csv的文件上传到2021/06/16/11/30/的嵌套文件夹时,需要从文件夹名称中检索文件夹ID。并且,当文件夹不存在时,需要创建新文件夹。
  • 为了实现这一点,不幸的是,循环使用了service.files().list()的方法。因为需要检查每个文件夹ID。

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

service = build('drive', 'v3', credentials=credentials)

path = '2021/06/16/11/30' # Please set the path.
folder_id = 'parent-folder-id' # Please set the top folder ID.

# Check the folder structure and create new folder if the folder is not existing.
pathList = path.split('/')
for folder in pathList:
    q = "'" + folder_id + "' in parents and name='" + folder + "' and mimeType='application/vnd.google-apps.folder' and trashed=false"
    files = service.files().list(q=q).execute().get('files')
    if not files:
        file_metadata = {
            'name': folder,
            'mimeType': 'application/vnd.google-apps.folder',
            'parents': [folder_id],
        }
        folder_id = service.files().create(
            body=file_metadata, fields='id').execute().get('id')
    else:
        folder_id = files[0].get('id')

# Upload file
file_metadata = {
    'name': 'my_file.csv',
    'parents': [folder_id],
}
media = MediaFileUpload('my_file.csv', mimetype='text/csv', resumable=True)
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f'Folder ID: {file.get("id")}')
  • 在此修改后的脚本中,当路径为path = '2021/06/16/11/30'时,当每个文件夹中不存在该文件夹时,将创建该文件夹。当文件夹存在于每个文件夹中时,不创建新文件夹。

参考文献: