使用 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'
时,当每个文件夹中不存在该文件夹时,将创建该文件夹。当文件夹存在于每个文件夹中时,不创建新文件夹。
参考文献:
我需要使用 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'
时,当每个文件夹中不存在该文件夹时,将创建该文件夹。当文件夹存在于每个文件夹中时,不创建新文件夹。