如何从付费专区后面的Excel文件下载到熊猫数据框?

时间:2015-06-21 04:10:28

标签: python python-2.7 pandas

我的网站需要登录才能访问数据。

import pandas as pd
import requests

r = requests.get(my_url, cookies=my_cookies) # my_cookies are imported from a selenium session.
df = pd.io.excel.read_excel(r.content, sheetname=0)

的回复:

IOError: [Errno 2] No such file or directory: 'Ticker\tAction\tName\tShares\tPrice\...

显然,str被处理为文件名称。有没有办法将其作为文件处理?或者我们可以将cookie传递给pd.get_html吗?

编辑:经过进一步处理后,我们现在可以看到这实际上是一个csv文件。下载文件的内容为:

In [201]: r.content
Out [201]: 'Ticker\tAction\tName\tShares\tPrice\tCommission\tAmount\tTarget Weight\nBRSS\tSELL\tGlobal Brass and Copper Holdings Inc\t400.0\t17.85\t-1.00\t7,140\t0.00\nCOHU\tSELL\tCohu Inc\t700.0\t12.79\t-1.00\t8,953\t0.00\nUNTD\tBUY\tUnited Online Inc\t560.0\t15.15\t-1.00\t-8,484\t0.00\nFLXS\tBUY\tFlexsteel Industries Inc\t210.0\t40.31\t-1.00\t-8,465\t0.00\nUPRO\tCOVER\tProShares UltraPro S&P500\t17.0\t71.02\t-0.00\t-1,207\t0.00\n'

请注意,它是制表符分隔的。尝试:

# csv version 1
df = pd.read_csv(r.content) 
# Returns error, file does not exist. Apparently read_csv() is also trying to read it as a file.

# csv version 2
fh = io.BytesIO(r.content)
df = pd.read_csv(fh) # ValueError: No columns to parse from file.

# csv version 3
s = StringIO(r.content)
df = pd.read_csv(s)
# No error, but the resulting df is not parsed properly; \t's show up in the text of the dataframe.

2 个答案:

答案 0 :(得分:2)

只需将文件内容包装在BytesIO

with io.BytesIO(r.content) as fh:
    df = pd.io.excel.read_excel(fh, sheetname=0)

答案 1 :(得分:1)

此功能自2014年起包含在update中。根据documentation,它就像提供网址一样简单:

  

字符串可以是URL。有效的URL方案包括http,ftp,s3和file。对于文件URL,需要主机。例如,本地文件可以是file://localhost/path/to/workbook.xlsx

根据您提供的代码,看起来您使用的是pandas 0.13.x?如果您可以升级到更新版本(下面的代码使用0.16.x进行测试),您可以在不使用requests库的情况下使其工作。这是在0.14.1

中添加的
data2 = pd.read_excel(data_url)

作为完整脚本的示例(示例XLS文档取自original bug报告,指出read_excel不接受URL):

import pandas as pd
data_url = "http://www.eia.gov/dnav/pet/xls/PET_PRI_ALLMG_A_EPM0_PTC_DPGAL_M.xls"
data = pd.read_excel(data_url, "Data 1", skiprows=2)