【问题标题】:Upload xlsx into Google Drive shared folder将 xlsx 上传到 Google Drive 共享文件夹
【发布时间】:2019-07-11 04:58:32
【问题描述】:

我想将与 .py 文件位于同一目录中的文件 risk_pos.xlsx 上传到共享驱动器。任何帮助将不胜感激。

我的代码:

scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"]
os.chdir(sys.path[0])
creds = ServiceAccountCredentials.from_json_keyfile_name("client_secret1.json", scope)
client = gspread.authorize(creds)

DRIVE = build('drive', 'v3', http=creds.authorize(Http()))

files = DRIVE.files().list().execute().get('files', [])
for f in files:
    print(f['name'], f['mimeType'])


file_metadata = {'inventory': 'risk_pos.xlsx', 'parents': ['XXXXXXXXXXXXXXXX']}
media = MediaFileUpload('risk_pos.xlsx', mimetype='application/vnd.ms-excel')
files = DRIVE.files().create(body=file_metadata, supportsTeamDrives=True, media_body=media, fields='id').execute()

错误:

File "risk_pos3.py", line 59, in <module>
    files = DRIVE.files().create(body=file_metadata, supportsTeamDrives=True, media_body=media, fields='id').execute()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
return wrapped(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/googleapiclient/http.py", line 851, in execute
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 404 when requesting 
https://www.googleapis.com/upload/drive/v3/files?supportsTeamDrives=true&fields=id&alt=json&uploadType=multipart returned "File not found: XXXXXXXXXXXXXXXXXX.">

编辑:

我现在没有错误。我刚刚删除了'parents': ['XXXXXXXXXXXXXXXX'] 周围的括号 但我没有看到该文件显示在云端硬盘中。每次我运行这个过程时,似乎都会出现一些新的东西。一个名为untitled... 的文件如下所示,您可以看到文件数量在增加。但云端硬盘中没有 untitled... 文件。

 JRACMB-MahfoudD:market_risk delalma$ python3 risk_pos3.py 
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Market_data application/vnd.google-apps.spreadsheet
 Market_data_volume application/vnd.google-apps.spreadsheet
 Getting started application/pdf
JRACMB-MahfoudD:market_risk delalma$ python3 risk_pos3.py 
Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Market_data application/vnd.google-apps.spreadsheet
 Market_data_volume application/vnd.google-apps.spreadsheet
 Getting started application/pdf
 JRACMB-MahfoudD:market_risk delalma$ python3 risk_pos3.py 
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Untitled application/vnd.ms-excel
 Market_data application/vnd.google-apps.spreadsheet
 Market_data_volume application/vnd.google-apps.spreadsheet
 Getting started application/pdf

【问题讨论】:

    标签: python google-api google-api-python-client service-accounts


    【解决方案1】:

    服务帐户很棘手。如果上传没有错误,那么它可能正在上传,问题是它被上传到哪里?

    服务帐户不是您,它是拥有自己的驱动器帐户的虚拟用户。您可能已将文件上传到服务帐户驱动器帐户。我要做的第一件事就是运行一个 file.list 你能看到这个文件吗?

    问题是您说您在请求中使用了父母。这意味着您在服务帐户上创建了一个新文件夹并正在使用该文件夹,或者您在个人驱动器帐户上共享了一个文件夹并尝试上传到该文件夹​​。无论哪种方式,file.list 都可以帮助您确定文件的位置,如果服务帐户上传它可以访问它,这将是查找文件的最简单方法。

    无标题

    文件分两部分上传。首先是包含文件名之类的元数据,其次是文件本身的实际数据。您的问题是您没有上传元数据。

    file_metadata = {'name': 'photo.jpg'}
    media = MediaFileUpload('files/photo.jpg',
                            mimetype='image/jpeg')
    file = drive_service.files().create(body=file_metadata,
                                        media_body=media,
                                        fields='id').execute()
    print 'File ID: %s' % file.get('id')
    

    您可能想阅读managing uploads

    至于始终创建一个新文件,考虑到您正在发送 file.create,那么如果您希望它覆盖现有文件,则始终会创建一个新文件,那么您将需要执行 file.update

    【讨论】:

    • 好吧。上面重新排列的数据来自file.list()。所以我只能通过file.list() 看到这些文件,但无法在浏览器中看到它们,而且我看不到成千上万的地方可能让我感到紧张。
    • 服务帐户没有 Web 视图。最简单的方法是将服务帐户上的文件夹与您的个人驱动器帐户共享,然后它们将显示为与您共享。 developers.google.com/drive/api/v3/reference/permissions/create
    • 谢谢。我尝试将文件夹 ID 放入您发送给我的链接中。但我有一个 400 错误。 ` "code": 400, "message": "Invalid value for: is not a valid value"`
    • 这可能是因为您没有访问权限,服务帐户将需要对文件和您的用户 ID 调用权限插入