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")