Экспорт Google Sheet в Open XML Document и запись на диск с помощью Python

#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 Спасибо за ответ. Я рад, что ваша проблема была решена.