问题:网址中的熊猫read_csv
我将Python 3.4与IPython结合使用,并具有以下代码。我无法从给定的URL读取csv文件:
import pandas as pd
import requests
url="https://github.com/cs109/2014_data/blob/master/countries.csv"
s=requests.get(url).content
c=pd.read_csv(s)
我有以下错误
“预期的文件路径名或类文件对象,得到类型”
我怎样才能解决这个问题?
回答 0
更新资料
0.19.2
现在,您可以从熊猫直接传递URL。
正如错误所暗示的,pandas.read_csv
需要一个类似文件的对象作为第一个参数。
如果要从字符串读取csv,可以使用io.StringIO
(Python 3.x)或StringIO.StringIO
(Python 2.x)。
另外,对于URL- https://github.com/cs109/2014_data/blob/master/countries.csv-您正在获得html
响应,而不是原始的csv,您应该使用Raw
github页面中的链接给出的url 获取原始的csv响应-https: //raw.githubusercontent.com/cs109/2014_data/master/countries.csv
范例-
import pandas as pd
import io
import requests
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
s=requests.get(url).content
c=pd.read_csv(io.StringIO(s.decode('utf-8')))
回答 1
在最新版本的pandas(0.19.2
)中,您可以直接传递网址
import pandas as pd
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)
回答 2
正如我评论的那样,您需要使用StringIO对象并进行解码,即c=pd.read_csv(io.StringIO(s.decode("utf-8")))
如果使用请求,则需要进行解码,因为如果您使用.text ,则content会返回字节,您只需要像s = requests.get(url).text
c = 那样传递s即可pd.read_csv(StringIO(s))
。
一种更简单的方法是将原始数据的正确url 直接传递给read_csv
,您不必传递像object这样的文件,您可以传递url从而根本不需要请求:
c = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")
print(c)
输出:
Country Region
0 Algeria AFRICA
1 Angola AFRICA
2 Benin AFRICA
3 Botswana AFRICA
4 Burkina AFRICA
5 Burundi AFRICA
6 Cameroon AFRICA
..................................
从 文档:
filepath_or_buffer:
字符串或文件句柄/ StringIO字符串可以是URL。有效的URL方案包括http,ftp,s3和file。对于文件URL,需要一个主机。例如,本地文件可以是文件://localhost/path/to/table.csv
回答 3
您遇到的问题是,进入变量s的输出不是csv,而是html文件。为了获得原始的csv,您必须将url修改为:
‘ https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv ‘
您的第二个问题是read_csv需要一个文件名,我们可以通过使用io模块中的StringIO来解决此问题。第三个问题是request.get(url).content提供了字节流,我们可以改用request.get(url).text解决。
最终结果是此代码:
from io import StringIO
import pandas as pd
import requests
url='https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv'
s=requests.get(url).text
c=pd.read_csv(StringIO(s))
输出:
>>> c.head()
Country Region
0 Algeria AFRICA
1 Angola AFRICA
2 Benin AFRICA
3 Botswana AFRICA
4 Burkina AFRICA
回答 4
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")
回答 5
要通过熊猫中的URL导入数据,只需应用下面的简单代码即可,实际上效果更好。
import pandas as pd
train = pd.read_table("https://urlandfile.com/dataset.csv")
train.head()
如果您对原始数据有疑问,则只需在网址前添加“ r”
import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()