python - Excel 文件未显示在 Google 云端硬盘中

标签 python google-app-engine google-drive-api

我正在尝试使用 Python 中的 API 从 CSV 创建新的 Google Sheets 电子表格,并且我的代码运行,但创建的工作表不会显示在我的 Google 云端硬盘中的任何位置。知道我做错了什么吗?

from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from apiclient.http import MediaFileUpload

#Set up a credentials object I think
creds =
ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', 
['https://www.googleapis.com/auth/drive'])

#Now build our api object, thing
drive_api = build('drive', 'v3', credentials=creds)

folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
file_name = "1505"
mimeType = "application/vnd.google-apps.spreadsheet"

print("Uploading file " + file_name + "...")


file_metadata = {
    'name': file_name,
    'mimeType': mimeType
}

#We have to make a request hash to tell the google API what we're giving it
body = {'name': file_name, 'mimeType': mimeType}
body['parents'] = [{'id':folder_id}]

#Now create the media file upload object and tell it what file to upload,
#in this case 'test.html'
media = MediaFileUpload('1505.csv', mimetype = 'text/csv')

#Now we're doing the actual post, creating a new file of the uploaded type
fiahl = drive_api.files().create(body=body, media_body=media).execute()

#Because verbosity is nice
print("Created file '%s' id '%s'." % (fiahl.get('name'), fiahl.get('id')))

最佳答案

这个答案怎么样?

问题:

我认为你的脚本有效。但是从您的脚本来看,如果运行脚本时没有发生错误,并且 client_secret.json 是创建服务帐户时的文件,我认为您正在尝试使用服务帐户上传文件。服务帐户不是您的帐户。因此,当您使用服务帐户将文件上传到 Google 云端硬盘时,该文件会创建到服务帐户的云端硬盘中。这样,上传的文件就无法在您的 Google 云端硬盘上看到。

解决方案

当您想使用 Google 云端硬盘上的服务帐户查看上传的文件时,请与您的帐户共享该文件。这样,当使用Service Account上传文件时,就可以看到上传的文件

修改点:

  • 您使用 Drive API v3。因此请将 body['parents'] = [{'id':folder_id}] 修改为 body['parents'] = [folder_id]
  • 如果 folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc" 的文件夹 ID 位于您的 Google 云端硬盘上,请将其修改为服务帐号上的文件夹 ID。作为测试用例,我使用 root 作为文件夹 ID。
  • 服务帐户上传文件后,所有者将更改为您的帐户。这样,您就可以在 Google 云端硬盘的根目录中看到上传的文件。

修改后的脚本:

在运行脚本之前,请将您的 Google 帐户的电子邮件地址设置为 'emailAddress': '### 您的 Google 帐户的电子邮件地址 ###'

from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from apiclient.http import MediaFileUpload

# Set up a credentials object I think
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', ['https://www.googleapis.com/auth/drive'])

# Now build our api object, thing
drive_api = build('drive', 'v3', credentials=creds)

folder_id = "root"  # Modified from "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
file_name = "1505"
mimeType = "application/vnd.google-apps.spreadsheet"

print("Uploading file " + file_name + "...")

file_metadata = {
    'name': file_name,
    'mimeType': mimeType
}

# We have to make a request hash to tell the google API what we're giving it
body = {'name': file_name, 'mimeType': mimeType}
body['parents'] = [folder_id]  # Modified

# Now create the media file upload object and tell it what file to upload,
# in this case 'test.html'
media = MediaFileUpload('1505.csv', mimetype='text/csv')

# Now we're doing the actual post, creating a new file of the uploaded type
fiahl = drive_api.files().create(body=body, media_body=media).execute()

# Because verbosity is nice
print("Created file '%s' id '%s'." % (fiahl.get('name'), fiahl.get('id')))

# I added below script.
user_permission = {
    'type': 'user',
    'role': 'owner',
    'emailAddress': '### Email address of your Google account ###'
}
drive_api.permissions().create(
    fileId=fiahl.get('id'),
    body=user_permission,
    transferOwnership=True,
).execute()

注意:

  • 在这种情况下,您无法将文件放入您的 Google 帐户的特定文件夹中。因为使用了服务帐户。
    • 如果您想将文件直接上传到 Google 云端硬盘上的特定文件夹,请使用 OAuth2 而不是服务帐户。
  • 这是一个简单修改的​​脚本。因此,请根据您的情况修改此设置。

引用文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

关于python - Excel 文件未显示在 Google 云端硬盘中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957908/

相关文章:

python - 检查python中df中每一列值的每一行

python - 如何在可浏览的 Django Rest API 中隐藏 HTML 表单中的字段?

用于聊天应用程序的 Python 或 Node

android - kindle fire 中的 google drive/docs api

javascript - 使用 javascript 将任何人的文件上传到我的谷歌驱动器

python - 如何获取从 smtplib 发送的电子邮件的消息 ID

mysql - 错误 1045 (28000) 访问被拒绝 cloudSQL

python - 在 app.yaml 配置中处理 favicon

php - 在生产中更改数据库而不丢失数据

java - 如何在我的 java 应用程序中对 Google OAuth 的 client_id 和 client_secret 进行硬编码?