来自url的Pandas read_csv

ven*_*nom 106 python csv request pandas

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

我有以下错误

"预期的文件路径名或类文件对象,得到类型"

我怎样才能解决这个问题?

ino*_*odb 200

在最新版本的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)
Run Code Online (Sandbox Code Playgroud)

  • 由于 urllib 无法处理的 https 协议,该代码返回 `urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>`。 (5认同)

Ana*_*mar 123

正如错误所暗示的那样,0.19.2需要一个类似文件的对象作为第一个参数.

如果要从字符串中读取csv,可以使用pandas.read_csv(Python 3.x)或io.StringIO(Python 2.x).

另外,对于URL - https://github.com/cs109/2014_data/blob/master/countries.csv - 你得到回复StringIO.StringIO响应,而不是原始csv,你应该使用htmlgithub页面中链接给出的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')))
Run Code Online (Sandbox Code Playgroud)

更新

从熊猫Raw你现在可以直接传递网址.

  • 在最新版本的pandas中你可以直接给出url,即`c = pd.read_csv(url)` (3认同)
  • “从 pandas 0.19.2 更新,您现在可以直接传递 url。” 除非您不能,因为您需要传递身份验证参数,在这种情况下,非常需要原始示例。 (3认同)

Pad*_*ham 9

正如我评论你需要使用一个StringIO对象并解码,即c=pd.read_csv(io.StringIO(s.decode("utf-8")))如果使用请求,你需要解码为.content返回字节,如果你使用.text你只需要传递s,因为是s = requests.get(url).textc = 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)
Run Code Online (Sandbox Code Playgroud)

输出:

                              Country         Region
0                             Algeria         AFRICA
1                              Angola         AFRICA
2                               Benin         AFRICA
3                            Botswana         AFRICA
4                             Burkina         AFRICA
5                             Burundi         AFRICA
6                            Cameroon         AFRICA
..................................
Run Code Online (Sandbox Code Playgroud)

来自 文档:

filepath_or_buffer:

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


小智 6

url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")
Run Code Online (Sandbox Code Playgroud)


Pab*_*rre 5

您遇到的问题是进入变量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))
Run Code Online (Sandbox Code Playgroud)

输出:

>>> c.head()
    Country  Region
0   Algeria  AFRICA
1    Angola  AFRICA
2     Benin  AFRICA
3  Botswana  AFRICA
4   Burkina  AFRICA
Run Code Online (Sandbox Code Playgroud)