Загрузите xlsx в общую папку Google Диска - PullRequest
1 голос
/ 11 июля 2019

Я хотел бы загрузить файл risk_pos.xlsx, который находится в том же каталоге, что и файл .py, на общий диск. Любая помощь будет оценена, пожалуйста.

Мой код:

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 голосов
/ 11 июля 2019

Сервисные аккаунты сложны.Если при загрузке нет ошибки, то, вероятно, она загружается, вопрос заключается в том, куда она загружается?

Учетная запись службы - это не вы фиктивный пользователь с собственной учетной записью диска.Возможно, вы загрузили файл в учетную запись диска служебных учетных записей.Во-первых, я бы запустил файл 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')

Возможно, вы захотите прочитать управление загрузками

Что касается постоянного создания нового файла, который логичен, учитывая, что вы отправляете file.create, а затем новыйФайл всегда будет создан, если вы хотите перезаписать существующий файл, тогда вам нужно будет выполнить file.update

...