Загрузка CSV в электронную таблицу на Диске с помощью API v2
Как загрузить локальный файл CSV на Google Диск с помощью Дискового API v2, чтобы загруженный файл находился в родной таблице Google. > . Предпочтительно в Python, но необработанный HTTP-запрос будет достаточным.
Что я пробовал:
-
Запросить тип содержимого тела: 'application/vnd.google-apps.spreadsheet', media_body content-type: 'text/csv'. → 401 Плохой запрос
-
Запросить тип содержимого тела: 'application/vnd.google-apps.spreadsheet', media_body content-type: 'application/vnd.google-apps.spreadsheet'. → 400 Bad Request
-
... (пара других, таких как выход из свойства и т.п., обычно получает 400 или диск не распознал его как родную электронную таблицу)
Ответы
Ответ 1
Ваш запрос на вставку должен указывать text/csv
как тип содержимого.
Уловкой для преобразования файла является добавление параметра запроса ?convert=true
к URL-адресу запроса:
https://developers.google.com/drive/v2/reference/files/insert
Ответ 2
(март 2017 г.). Примечание. В то время как вопрос конкретно задает вопрос о драйвере API v2, разработчики должны знать, что Google Drive API команда выпустила v3 в конце 2015 года, а в этом выпуске insert()
изменила имена на create()
, чтобы лучше отразить операция файла. Там также больше нет флага конвертации - вы просто указываете MIMEtypes... представьте, что!
Документация также была улучшена: теперь существует специальное руководство, посвященное загрузкам (простое, многократное и возобновляемое), которое поставляется с образцом кода в Java, Python, PHP, С#/. NET, Ruby, JavaScript/ Node.js и iOS/Obj-C, чтобы загрузить файл, а другой, который импортирует CSV файл в качестве Листа Google.
Просто для того, чтобы прямо показать это, ниже представлено одно альтернативное решение Python (к образцу в документах) для коротких файлов ( "простая загрузка" ), где вам не нужен класс apiclient.http.MediaFileUpload
. Этот фрагмент предполагает, что ваш auth-код работает там, где конечная точка службы DRIVE
с минимальным объемом полномочий https://www.googleapis.com/auth/drive.file
.
# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'
# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))
Ответ 3
Ответ Клаудио Керубино правильный - вам нужно добавить параметр вручную. Так как вы спросили в Python, вот конкретный пример:
body = {
'mimeType':'text/csv',
'title': 'title'
}
# service: your authenticated service
# media: your apiclient.http.MediaFileUpload object, with 'text/csv' mimeType
req = service.files().insert(media_body=media, body=body)
# patch the uri to ensure conversion, as the documented kwarg seems to be borked.
# you may need to use '?convert=true' depending on the uri, not taking that into
# account here for sake of simplicity.
req.uri = req.uri + '&convert=true'
# now we can execute the response.
resp = req.execute()
# should be OK
assert resp['mimeType'] == u'application/vnd.google-apps.spreadsheet'
Ответ 4
Java:
//Insert a file
File body = new File();
body.setTitle("CSV");
body.setDescription("A test document");
body.setMimeType("text/csv");
java.io.File fileContent = new java.io.File("document.csv");
FileContent mediaContent = new FileContent("text/csv", fileContent);
Insert insert = service.files().insert(body, mediaContent);
insert.setConvert(true);
File file = insert.execute();
System.out.println("File ID: " + file.getId());
Ответ 5
Лучший способ начать использовать веб-форму на
https://developers.google.com/drive/v2/reference/files/insert#try-it