【发布时间】:2015-06-21 04:10:27
【问题描述】:
我有一个需要登录才能访问数据的网站。
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.
【问题讨论】:
-
您为网站付费吗?询问如何违反服务条款的形式不好。
-
是的,我为此付费,并且 TOS 允许。
-
我现在明白了。这些 StringIO() 很棘手。它们在第一次使用后自毁。在添加第二个参数来指定分隔符时,版本 2 和版本 3 都可以使用;但只是第一次阅读。
df = pd.read_csv(fh, '\t')工作! -
它们不会自毁,它们的行为就像任何文件一样——当您阅读时移动光标。当您再次阅读时,您将从光标所在的位置开始阅读。为了能够再次读取文件,您需要使用 seek 方法:s.seek(0) 请记住,您将来可能需要这个。
标签: python python-2.7 pandas