Как мне прочитать файл Excel напрямую из API Dropbox, используя pandas.read_excel ()? - PullRequest
0 голосов
/ 10 декабря 2018

Мне интересно сравнить две версии небольших файлов Excel, хранящихся в Dropbox, как отдельную версию.

Используя Python SDK, в частности метод files_download () , я получаюобъект запросыОшибка:

TypeError('file() argument 1 must be encoded string without null bytes, not str',)

Я знаю, что мне не хватает чего-то фундаментального, возможно, нужно закодировать файл в двоичном виде.(Пробовал base64.b64encode и некоторые другие вещи, но пока безуспешно.) Я надеюсь, что кто-нибудь может помочь мне с точкой в ​​правильном направлении, возможно, с модулем io?

Я использую Python2.7.15

Во избежание сомнений, я специально стараюсь избегать этапа первого сохранения файлов Excel в файловую систему.Я уверен Я могу выполнить более широкую задачу таким образом, но для оптимизации я пытаюсь читать файлы из Dropbox непосредственно в pandas DataFrames, и тот факт, что метод read_excel () принимает файл как объект означает - я думаю - что я должен быть в состоянии сделать это.

В принципе, я думаю это подводит итог боли, которую яиспытываю на данный момент.Мне нужно получить ответ от Dropbox в виде файлового объекта.

1 Ответ

0 голосов
/ 01 февраля 2019

Следующий код будет делать то, что вы хотите.

# Imports and initialization of variables
from contextlib import closing # this will correctly close the request
import io
import dropbox
token = "YOURTOKEN" #get token on https://www.dropbox.com/developers/apps/
dbx = dropbox.Dropbox(token)
yourpath = "somefile.xlsx" # This approach is not limited to excel files

# Relevant streamer
def stream_dropbox_file(path):
    _,res=dbx.files_download(path)
    with closing(res) as result:
        byte_data=result.content
        return io.BytesIO(byte_data)

# Usage
file_stream=stream_dropbox_file(yourpath)
pd.read_excel(file_stream)

Приятной частью этого подхода является то, что использование io.BytesIO преобразует данные в общий файлоподобный объект.Таким образом, вы также можете использовать это для чтения таких вещей, как csv с pd.read_csv().

Код также должен работать для не-pandas io методов, таких как загрузка изображений, но я непроверил это явно.

...