我试图从给定的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)

我有以下错误

"期望的文件路径名称或类文件对象,已获得<类'bytes'>类型"

我该如何解决这个问题?我使用的是Python 3.4


当前回答

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

其他回答

你遇到的问题是,输入变量's'的输出不是csv文件,而是html文件。 为了得到原始的csv,你必须修改url为:

“https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv”

第二个问题是read_csv需要一个文件名,我们可以通过使用StringIO from io模块来解决这个问题。 第三个问题是request.get(url)。内容传递一个字节流,我们可以使用request.get(url)来解决这个问题。文本。

最终结果是这样的代码:

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)
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")

更新:从熊猫0.19.2你现在可以直接传递read_csv() url,虽然这将失败,如果它需要认证。


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

使用熊猫。使用类文件对象作为第一个参数的Read_csv。

如果你想从字符串中读取csv,你可以使用io.StringIO。 对于URL https://github.com/cs109/2014_data/blob/master/countries.csv,你得到html响应,而不是原始的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

通过URL导入数据在熊猫只是应用简单的下面的代码,它的工作实际上更好。

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

如果你有一个原始数据的问题,然后把'r'前面的URL

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