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)
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你现在可以直接传递网址.
正如我评论你需要使用一个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)
您遇到的问题是进入变量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)
| 归档时间: |
|
| 查看次数: |
105951 次 |
| 最近记录: |