Python Linux EC2 机器上的作业将文件放到 Google 驱动器上
Python Job on Linux EC2 Machine that drops file on Google Drive
我看到各种文章都解决了我想要的一些问题,但不是全部。使用 Python 如何将文件上传到 Google 驱动器上的特定文件夹?此外,我想确保令牌永不过期,因为我希望它从远程计算机 运行。
编辑我已经尝试使用服务帐户进行以下操作。
SCOPES = [
'https://www.googleapis.com/auth/drive'
]
SERVICE_ACCOUNT_FILE = 'path/to/local/creds.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = discovery.build('drive', 'v3', credentials=credentials)
SS_SERVICE = build('sheets', 'v4', credentials = credentials)
file_metadata = {
'name': 'A Test File.csv',
'parents': [{"kind": "drive#folder",
"id":'idoffolder'}],
'mimeType': 'text/csv'
}
req = service.files().create(body=file_metadata,
media_body='path_to_local_csv')
req.uri = req.uri + '&convert=true'
resp = req.execute()
我从 URL 中检索了文件夹的 ID:
https://drive.google.com/drive/u/1/folders/idIwanttouse
这段代码似乎没有错误,但我在指定的文件夹中没有看到名为 A Test File.csv 的文件。
有趣的是,当我 运行 以下内容时:
service.files().list().execute()
我看到文件“A Test File.csv”,但在我的 google 驱动器共享帐户中没有其他文件。
一些注意事项:我正在尝试将文件添加到我所属的共享企业帐户,另外我正在使用服务帐户。
有什么想法吗?
我认为您的目标和现状如下。
- 您想将
A Test File.csv
的 CSV 文件上传到 Google 驱动器中的特定文件夹,方法是使用服务帐户转换为 Google 电子表格。
- 来自
I see the file "A Test File.csv" but no other files in my google drive shared account.
,您想在 Google 驱动器上查看上传的文件。
- 您想使用 Drive API v3 和用于 python 的 googleapis 来实现此目的。
- 您已经可以使用服务帐户使用云端硬盘 API。
修改点:
- 当您想使用 Drive API v3 将文件上传到特定文件夹时,请设置文件元数据的文件夹 ID,如
'parents': ['idoffolder'],
。在您的脚本中,使用了 'parents': [{"kind": "drive#folder","id":'idoffolder'}],
。这用于 Drive API v2。我认为这可能是您遇到问题的原因之一。
- 在这种情况下,当您想在 Google 驱动器的特定文件夹中查看上传的文件时,请与服务帐户的电子邮件共享该文件夹。通过这个,你可以看到它。请注意这一点。
- 要上传本地PC文件,请将
media_body='path_to_local_csv'
修改为media_body=MediaFileUpload("path_to_local_csv", mimetype="text/csv", resumable=True)
。我认为这可能是您遇到问题的原因之一。
- 当您想通过转换为 Google 电子表格来上传 CSV 文件时,您可以通过将 mimeType 包含到文件元数据中来实现。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
在使用此脚本之前,请设置并确认变量。
from googleapiclient import discovery
from google.oauth2 import service_account
from apiclient.http import MediaFileUpload
SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'path/to/local/creds.json'
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = discovery.build('drive', 'v3', credentials=credentials)
file_metadata = {
'name': 'A Test File.csv',
'parents': ['idoffolder'],
'mimeType': 'application/vnd.google-apps.spreadsheet'
}
media_body = MediaFileUpload('path_to_local_csv', mimetype="text/csv", resumable=True)
resp = service.files().create(body=file_metadata, media_body=media_body, supportsAllDrives=True).execute()
print(resp)
- 当上面的脚本是 运行 时,您本地 PC 中
path_to_local_csv
的 CSV 文件被上传到 Google 驱动器的特定文件夹 idoffolder
作为 Google电子表格。
注:
- 在此修改后的脚本中,假设您的服务帐户
creds.json
具有将文件上传到特定文件夹的权限。
- 如果您将使用服务帐户冒充他们的常规帐户,请检查 domain-wide delegation。
- 关于
Additionally, I want to make sure the token never expires as I want it to run from a remote machine.
,在上面的脚本中,访问令牌每隔 运行 检索一次。至此,我觉得应该不会出现这个问题。
参考文献:
我看到各种文章都解决了我想要的一些问题,但不是全部。使用 Python 如何将文件上传到 Google 驱动器上的特定文件夹?此外,我想确保令牌永不过期,因为我希望它从远程计算机 运行。
编辑我已经尝试使用服务帐户进行以下操作。
SCOPES = [
'https://www.googleapis.com/auth/drive'
]
SERVICE_ACCOUNT_FILE = 'path/to/local/creds.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = discovery.build('drive', 'v3', credentials=credentials)
SS_SERVICE = build('sheets', 'v4', credentials = credentials)
file_metadata = {
'name': 'A Test File.csv',
'parents': [{"kind": "drive#folder",
"id":'idoffolder'}],
'mimeType': 'text/csv'
}
req = service.files().create(body=file_metadata,
media_body='path_to_local_csv')
req.uri = req.uri + '&convert=true'
resp = req.execute()
我从 URL 中检索了文件夹的 ID: https://drive.google.com/drive/u/1/folders/idIwanttouse
这段代码似乎没有错误,但我在指定的文件夹中没有看到名为 A Test File.csv 的文件。
有趣的是,当我 运行 以下内容时:
service.files().list().execute()
我看到文件“A Test File.csv”,但在我的 google 驱动器共享帐户中没有其他文件。
一些注意事项:我正在尝试将文件添加到我所属的共享企业帐户,另外我正在使用服务帐户。
有什么想法吗?
我认为您的目标和现状如下。
- 您想将
A Test File.csv
的 CSV 文件上传到 Google 驱动器中的特定文件夹,方法是使用服务帐户转换为 Google 电子表格。 - 来自
I see the file "A Test File.csv" but no other files in my google drive shared account.
,您想在 Google 驱动器上查看上传的文件。 - 您想使用 Drive API v3 和用于 python 的 googleapis 来实现此目的。
- 您已经可以使用服务帐户使用云端硬盘 API。
修改点:
- 当您想使用 Drive API v3 将文件上传到特定文件夹时,请设置文件元数据的文件夹 ID,如
'parents': ['idoffolder'],
。在您的脚本中,使用了'parents': [{"kind": "drive#folder","id":'idoffolder'}],
。这用于 Drive API v2。我认为这可能是您遇到问题的原因之一。- 在这种情况下,当您想在 Google 驱动器的特定文件夹中查看上传的文件时,请与服务帐户的电子邮件共享该文件夹。通过这个,你可以看到它。请注意这一点。
- 要上传本地PC文件,请将
media_body='path_to_local_csv'
修改为media_body=MediaFileUpload("path_to_local_csv", mimetype="text/csv", resumable=True)
。我认为这可能是您遇到问题的原因之一。 - 当您想通过转换为 Google 电子表格来上传 CSV 文件时,您可以通过将 mimeType 包含到文件元数据中来实现。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
在使用此脚本之前,请设置并确认变量。
from googleapiclient import discovery
from google.oauth2 import service_account
from apiclient.http import MediaFileUpload
SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'path/to/local/creds.json'
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = discovery.build('drive', 'v3', credentials=credentials)
file_metadata = {
'name': 'A Test File.csv',
'parents': ['idoffolder'],
'mimeType': 'application/vnd.google-apps.spreadsheet'
}
media_body = MediaFileUpload('path_to_local_csv', mimetype="text/csv", resumable=True)
resp = service.files().create(body=file_metadata, media_body=media_body, supportsAllDrives=True).execute()
print(resp)
- 当上面的脚本是 运行 时,您本地 PC 中
path_to_local_csv
的 CSV 文件被上传到 Google 驱动器的特定文件夹idoffolder
作为 Google电子表格。
注:
- 在此修改后的脚本中,假设您的服务帐户
creds.json
具有将文件上传到特定文件夹的权限。 - 如果您将使用服务帐户冒充他们的常规帐户,请检查 domain-wide delegation。
- 关于
Additionally, I want to make sure the token never expires as I want it to run from a remote machine.
,在上面的脚本中,访问令牌每隔 运行 检索一次。至此,我觉得应该不会出现这个问题。