将xlsx上载到Google云端硬盘共享文件夹

时间:2019-07-11 04:58:32

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

我想将与.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

1 个答案:

答案 0 :(得分:0)

服务帐户非常棘手。如果上传没有错误,那么可能是上传了,问题是上传到哪里?

服务帐户不是您具有自己的驱动器帐户的虚拟用户。您可能已将文件上传到服务帐户驱动器帐户。我要做的第一件事是运行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

对于始终创建一个新文件,考虑到您正在发送文件,这是合乎逻辑的。create然后,如果您希望新文件覆盖现有文件,则将始终创建一个新文件,那么您需要执行file.update < / p>