如何使用 pandas.read_excel() 直接从 Dropbox 的 API 读取 Excel 文件?
How do I read an Excel file directly from Dropbox's API using pandas.read_excel()?
我有兴趣比较两个版本的小型 Excel 文件作为单独版本存储在 Dropbox 中。
使用 Python SDK,特别是 files_download() method, I'm getting a requests.models.Response object, but I'm having trouble getting pandas.read_excel() 来使用它。
这是代码片段:
with open(resp.content, "rb") as handle:
df = pandas.read_excel(handle.read())
错误:
TypeError('file() argument 1 must be encoded string without null bytes, not str',)
我知道我遗漏了一些基本的东西,可能需要将文件编码为二进制文件。 (尝试了 base64.b64encode 和其他一些东西,但还没有成功。)我希望有人可以帮助我指出正确的方向,可能是 io 模块?
我正在使用 Python 2.7.15
为避免疑义,我特别希望避免首先将 Excel 文件保存到文件系统的步骤。我 确定 我可以通过这种方式完成更广泛的 objective,但为了优化我正在尝试将文件从 Dropbox 直接读入 pandas DataFrame,并且read_excel() 方法采用文件-like 对象这一事实意味着——我认为——我应该能够做到那。
基本上,我认为 this 总结了我目前正在经历的痛苦。我需要将来自 Dropbox 的响应转换为类文件对象的形式。
以下代码将执行您想要的操作。
# 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's 和 pd.read_csv()
.
之类的内容
该代码也应该适用于非pandas io 方法,例如加载图像,但我还没有明确测试过。
我有兴趣比较两个版本的小型 Excel 文件作为单独版本存储在 Dropbox 中。
使用 Python SDK,特别是 files_download() method, I'm getting a requests.models.Response object, but I'm having trouble getting pandas.read_excel() 来使用它。
这是代码片段:
with open(resp.content, "rb") as handle:
df = pandas.read_excel(handle.read())
错误:
TypeError('file() argument 1 must be encoded string without null bytes, not str',)
我知道我遗漏了一些基本的东西,可能需要将文件编码为二进制文件。 (尝试了 base64.b64encode 和其他一些东西,但还没有成功。)我希望有人可以帮助我指出正确的方向,可能是 io 模块?
我正在使用 Python 2.7.15
为避免疑义,我特别希望避免首先将 Excel 文件保存到文件系统的步骤。我 确定 我可以通过这种方式完成更广泛的 objective,但为了优化我正在尝试将文件从 Dropbox 直接读入 pandas DataFrame,并且read_excel() 方法采用文件-like 对象这一事实意味着——我认为——我应该能够做到那。
基本上,我认为 this 总结了我目前正在经历的痛苦。我需要将来自 Dropbox 的响应转换为类文件对象的形式。
以下代码将执行您想要的操作。
# 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's 和 pd.read_csv()
.
该代码也应该适用于非pandas io 方法,例如加载图像,但我还没有明确测试过。