我正在尝试从给定的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
6条答案
按热度按时间bhmjp9jg1#
在最新版本的Pandas(
0.19.2
)中你可以直接传递url8oomwypt2#
更新:从Pandas
0.19.2
你现在可以只passread_csv()
the url directly,虽然这将失败,如果它需要身份验证。对于旧的panda版本,或者如果您需要身份验证,或者由于任何其他HTTP容错原因:
将
pandas.read_csv
与类似文件的对象一起用作第一个参数。io.StringIO
。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
示例:
备注:
在Python 2.x中,字符串缓冲区对象是
StringIO.StringIO
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,这样您就根本不需要请求:输出量:
从docs:
文件路径或缓冲区:
string或文件句柄/ StringIO字符串可以是URL。有效的URL方案包括http、ftp、s3和file。对于文件URL,需要主机。例如,本地文件可以是file://localhost/path/to/table.csv
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来解决这个问题。
最终结果是这样的代码:
输出:
hfyxw5xn5#
hivapdat6#
要通过Pandas中的URL导入数据,只需应用下面简单的代码,它实际上工作得更好。
如果您对原始数据有问题,则只需在URL前添加“r”即可