Pandas从url读取_csv

tjjdgumg  于 2022-12-09  发布在  其他
关注(0)|答案(6)|浏览(221)

我正在尝试从给定的URL读取csv文件,使用Python 3.x:

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)

我有以下错误
应为文件路径名或类似文件的对象,但得到的是〈class 'bytes'〉类型
我该如何解决这个问题?我使用的是Python 3.4

bhmjp9jg

bhmjp9jg1#

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

8oomwypt2#

更新:从Pandas0.19.2你现在可以只pass read_csv() the url directly,虽然这将失败,如果它需要身份验证。
对于旧的panda版本,或者如果您需要身份验证,或者由于任何其他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

dgsult0t

dgsult0t3#

正如我所评论的,你需要使用一个StringIO对象和解码,即c=pd.read_csv(io.StringIO(s.decode("utf-8"))),如果使用请求,你需要解码为。内容返回 * 字节 *,如果你使用。文本,你只需要传递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
..................................

docs

文件路径或缓冲区

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

btqmn9zl

btqmn9zl4#

问题是变量'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
hfyxw5xn

hfyxw5xn5#

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

hivapdat6#

要通过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()

相关问题