繁体   English   中英

使用 Google Drive API 创建嵌套文件夹

[英]Create nested folders with Google Drive API

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

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 传递?

改装要点:

  • 在 Google Drive,每个文件和文件夹都由唯一 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' ,当每个文件夹中都不存在该文件夹时,会创建该文件夹。 当文件夹存在于每个文件夹中时,不会创建新文件夹。

参考:

files.create API 仅创建一个文件,并且无法在一次调用中创建多个文件。 所以要回答你的问题,你需要先创建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")}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM