网址中的熊猫read_csv


138

我将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)

我有以下错误

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

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


您将需要类似的东西,c=pd.read_csv(io.StringIO(s.decode("utf-8")))但您要获取的不是HTML的CSV文件,而是无法返回的文件,因此它将无法正常工作
Padraic Cunningham 2015年

3
我相当确定您想要的URL是"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
kylie.a 2015年

@venom,选择了更流行的答案作为正确答案
ibodi

Answers:


166

更新资料

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,您应该使用Rawgithub页面中的链接给出的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')))

如果响应很大,我想流式传输而不是为编码的内容,解码的内容和StringIO对象消耗内存,该怎么办?
akaihola

9
在最新版本的熊猫中,您可以直接提供URL,即c=pd.read_csv(url)
inodb

奇怪的是我有一个更新的版本pandas(0.23.4),但是我不能直接给出url。这个答案帮助我成功了。
Antti,

1
“从熊猫0.19.2更新,您现在可以直接传递URL。” 除非您不能,因为您需要传递身份验证参数,否则就很需要原始示例。
亚伦·霍尔

如果您需要使用请求对象返回的HTTP代码进行更好的错误处理(例如:500->可能需要重试,404->不重试),则此解决方案仍然很有用
JulienV

235

在最新版本的pandas(0.19.2)中,您可以直接传递网址

import pandas as pd

url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)

似乎直接使用它而不是直接使用请求即使使用也不会使用requests-cache
shadi

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

对于使用Python 2的用户,您将必须使用Python 2.7.10+。
avelis

从URL读取csv似乎有些问题。我一次从本地存储读取文件,一次从URL读取文件,但我不断从URL中获取错误。然后,我启用了error_bad_lines = False,并且超过99%的数据被忽略。URL是link。读取文件后,发现数据集的形状为(88,1),这是完全错误的
Rishik Mani

10

正如我评论的那样,您需要使用StringIO对象并进行解码,即c=pd.read_csv(io.StringIO(s.decode("utf-8")))如果使用请求,则需要进行解码,因为如果您使用.text ,则content会返回字节,您只需要像s = requests.get(url).textc = 那样传递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


1
您可以将URL直接提供给熊猫read_csv!当然!这是比我发现的解决方案简单得多的解决方案!:D
PabTorre 2015年

1
@pabtorre,是的,为什么阅读文档是一个好主意。
Padraic Cunningham 2015年

6

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


0

要通过熊猫中的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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.