Pandas 从 url 读取_csv

问题描述 投票:0回答:6

我正在尝试使用 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)

我有以下错误

“预期的文件路径名或类似文件的对象,获得类型”

我该如何解决这个问题?我正在使用Python 3.4

python csv pandas request
6个回答
353
投票

在最新版本的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)

260
投票

更新:从 pandas

0.19.2
,您现在可以直接传递
read_csv()
url
,尽管如果需要身份验证,则会失败。


对于较旧的 pandas 版本,或如果您需要身份验证,或出于任何其他 HTTP 容错原因:

使用

pandas.read_csv
和类似文件的对象作为第一个参数。

  • 如果你想从字符串中读取csv,你可以使用

    io.StringIO

  • 对于 URL

    https://github.com/cs109/2014_data/blob/master/countries.csv
    ,您会得到
    html
    响应,而不是 raw csv;您应该使用 github 页面中
    Raw
    链接给出的 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


20
投票

正如我所评论的,您需要使用 StringIO 对象并解码,即

c=pd.read_csv(io.StringIO(s.decode("utf-8")))
如果使用请求,您需要解码为 .content 返回 bytes 如果您使用 .text,您只需要按原样传递 s
s = requests.get(url).text
c =
pd.read_csv(StringIO(s))

更简单的方法是将raw数据的正确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
..................................

来自文档

文件路径或缓冲区

字符串或文件句柄/StringIO 该字符串可以是 URL。有效的 URL 方案包括 http、ftp、s3 和 file。对于文件 URL,需要一个主机。例如,本地文件可以是 file://localhost/path/to/table.csv


11
投票

您遇到的问题是,您进入变量“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

6
投票
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")

0
投票

要通过 pandas 中的 URL 导入数据,只需应用以下简单的代码,它实际上效果更好。

import pandas as pd
train = pd.read_table("https://urlandfile.com/dataset.csv")
train.head()

如果您对原始数据有疑问,只需在 URL 前添加“r”即可

import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()
© www.soinside.com 2019 - 2024. All rights reserved.