#python #python-3.x #google-sheets #google-drive-api #google-workspace
#python #python-3.x #google-sheets #google-drive-api #google-workspace
Вопрос:
Я использую листы GSuite для некоторых электронных таблиц, которые мы используем для заполнения базы данных нашего сервиса. Я пишу небольшой скрипт на Python, который будет создавать резервные копии наших файлов, записывая их на локальный диск.
Объект GSuite Sheet имеет id
и для экспорта Google Sheet, по крайней мере, согласно документации, необходимо использовать export_media(fileId, mimeType)
Тот mimeType
, который я экспортирую, — это документ Open Office. Пример Google о том, как это сделать, здесь: https://developers.google.com/drive/api/v3/manage-downloads#python
Моя проблема в том, что мои файлы полностью пусты. Вы заметите некоторые инструкции print в моем коде ниже, где выводится пустая строка bytes.
Объект запроса в моем методе хорошо выглядит в отладчике, и я не получаю никаких исключений, и программа выполняется до конца. Загрузчик сообщает, что он завершил задание и имеет размер 21033
. Я предполагаю, что это в байтах.
Вот цикл и метод, который я использую для экспорта файла и записи его на диск.
service = build("drive", "v3", credentials=delegated_credentials, cache_discovery=False)
files = service.files().list(**request_data).execute().get("files", [])
open_type = 'application/x-vnd.oasis.opendocument.spreadsheet'
for f in files:
export_file_to_open_office(f, service, open_type)
def export_file_to_open_office(file, drive_service, mime_type):
request = drive_service.files().export_media(fileId=file["id"], mimeType=mime_type).get()
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
print(fh.read()) # this outputs b''
while done is False:
status, done = downloader.next_chunk()
print(fh.read()) # this outputs b''
print("Download %d%%." % int(status.progress() * 100))
with open("my_file.xls", 'wb') as fil:
fil.write(fh.read())
Все, что я действительно хочу сделать, это получить свой лист и записать его на свой диск. Любые советы будут очень признательны.
Приветствия,
C
Ответ №1:
Как насчет этой модификации в вашем скрипте?
От:
with open("my_file.xls", 'wb') as fil:
fil.write(fh.read())
Для:
with open("my_file.xls", 'wb') as fil:
fh.seek(0) # <--- Added
fil.write(fh.read())
Ссылка:
Комментарии:
1. Внимание, @Tanaike, спасибо! .
seek()
, У меня возникают воспоминания о моих днях C в университете.2. @anowlinorbit Спасибо за ответ. Я рад, что ваша проблема была решена.