Pandas read_csv 来自 url
Pandas read_csv from url
我正在尝试使用 Python 3.x:
从给定 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)
我有以下错误
"Expected file path name or file-like object, got <class 'bytes'> type"
我该如何解决这个问题?我正在使用 Python 3.4
更新:从 pandas 0.19.2
开始,您现在可以 ,但如果它需要身份验证将会失败。
对于较早的pandas版本,或如果您需要身份验证,或出于任何其他 HTTP 容错原因:
将 pandas.read_csv
与类文件对象一起用作第一个参数。
如果要从字符串中读取 csv,可以使用 io.StringIO
.
对于 URL https://github.com/cs109/2014_data/blob/master/countries.csv
,你得到 html
响应,而不是 rawcsv;您应该使用 github 页面中 Raw
link 给出的 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')))
备注:
在 Python 2.x 中,字符串缓冲区对象是 StringIO.StringIO
正如我评论的那样,您需要使用 StringIO 对象并解码,即 c=pd.read_csv(io.StringIO(s.decode("utf-8")))
如果使用请求,您需要解码为 .content returns bytes如果您使用 .text,您只需要按原样传递 s s = requests.get(url).text
c = pd.read_csv(StringIO(s))
。
一个更简单的方法是将原始数据的正确url直接传递给read_csv
,你不要 必须传递一个像对象这样的文件,你可以传递一个 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
..................................
来自docs:
filepath_or_buffer :
string or file handle / StringIO
The string could be a URL. Valid URL schemes include http, ftp, s3, and file. For file URLs, a host is expected. For instance, a local file could be file ://localhost/path/to/table.csv
您遇到的问题是您进入变量 '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
在最新版本pandas(0.19.2
)中可以直接通过url
import pandas as pd
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)
To Import Data through URL in pandas just apply the simple below code it works actually better.
import pandas as pd
train = pd.read_table("https://urlandfile.com/dataset.csv")
train.head()
If you are having issues with a raw data then just put 'r' before URL
import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")
我正在尝试使用 Python 3.x:
从给定 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)
我有以下错误
"Expected file path name or file-like object, got <class 'bytes'> type"
我该如何解决这个问题?我正在使用 Python 3.4
更新:从 pandas 0.19.2
开始,您现在可以
对于较早的pandas版本,或如果您需要身份验证,或出于任何其他 HTTP 容错原因:
将 pandas.read_csv
与类文件对象一起用作第一个参数。
如果要从字符串中读取 csv,可以使用
io.StringIO
.对于 URL
https://github.com/cs109/2014_data/blob/master/countries.csv
,你得到html
响应,而不是 rawcsv;您应该使用 github 页面中Raw
link 给出的 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')))
备注:
在 Python 2.x 中,字符串缓冲区对象是 StringIO.StringIO
正如我评论的那样,您需要使用 StringIO 对象并解码,即 c=pd.read_csv(io.StringIO(s.decode("utf-8")))
如果使用请求,您需要解码为 .content returns bytes如果您使用 .text,您只需要按原样传递 s s = requests.get(url).text
c = pd.read_csv(StringIO(s))
。
一个更简单的方法是将原始数据的正确url直接传递给read_csv
,你不要 必须传递一个像对象这样的文件,你可以传递一个 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
..................................
来自docs:
filepath_or_buffer :
string or file handle / StringIO The string could be a URL. Valid URL schemes include http, ftp, s3, and file. For file URLs, a host is expected. For instance, a local file could be file ://localhost/path/to/table.csv
您遇到的问题是您进入变量 '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
在最新版本pandas(0.19.2
)中可以直接通过url
import pandas as pd
url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)
To Import Data through URL in pandas just apply the simple below code it works actually better.
import pandas as pd
train = pd.read_table("https://urlandfile.com/dataset.csv")
train.head()
If you are having issues with a raw data then just put 'r' before URL
import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")