2 votes

Comment lire un fichier Excel directement depuis l'API de Dropbox en utilisant pandas.read_excel() ?

Je souhaite comparer deux versions de petits fichiers Excel stockés dans Dropbox en tant que version séparée.

En utilisant le SDK Python, et plus particulièrement la fonction Méthode files_download() Je reçois un objet requests.models.Response, mais j'ai du mal à obtenir un objet pandas.read_excel() pour le consommer.

Voici l'extrait de code :

with open(resp.content, "rb") as handle:
    df = pandas.read_excel(handle.read())

L'erreur :

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

Je sais qu'il me manque quelque chose de fondamental, peut-être la nécessité d'encoder le fichier en tant que binaire. (J'ai essayé base64.b64encode, et d'autres choses, sans succès pour l'instant.) J'espère que quelqu'un pourra m'aider en m'indiquant la bonne direction, peut-être avec le module io ?

J'utilise Python 2.7.15

Pour éviter toute ambiguïté, je cherche spécifiquement à éviter l'étape consistant à enregistrer les fichiers Excel dans le système de fichiers. Je suis sûr Je peux atteindre l'objectif général de cette manière, mais pour optimiser, j'essaie de lire les fichiers de Dropbox directement dans pandas DataFrames, et le fait que la méthode read_excel() prenne un fichier- comme L'objet signifie que je penser -que je devrais être en mesure de le faire.

Fondamentalement, je pense que cette résume la douleur que j'éprouve en ce moment. J'ai besoin de récupérer la réponse de Dropbox sous la forme d'un objet de type fichier.

3voto

Ivo Merchiers Points 832

Le code suivant fera ce que vous voulez.

# 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)

L'avantage de cette approche est que l'utilisation de io.BytesIO convertit les données en un objet général de type fichier. Ainsi, vous pouvez également l'utiliser pour lire des choses comme csv con pd.read_csv() .

Le code devrait également fonctionner pour les méthodes nonandas io, comme le chargement d'images, mais je ne l'ai pas testé explicitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X