Панды читать CSV-файл из URL
Я использую Python 3.4 с IPython и имею следующий код. Я не могу прочитать csv-файл из данного URL:
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)
У меня есть следующие ошибки
"ожидаемый путь к файлу или файлоподобный объект, получил тип"
Как я могу это исправить?
4 ответов:
так же, как ошибка предполагает,
pandas.read_csvв качестве первого аргумента требуется файлоподобный объект.если вы хотите прочитать csv из строки, вы можете использовать
io.StringIO(Python 3.х) илиStringIO.StringIO(Python 2.x) .кроме того, для URL -https://github.com/cs109/2014_data/blob/master/countries.csv - ты возвращаешься
htmlответ, а не raw csv, вы должны использовать url, указанныйRawссылка на странице github для получение необработанного ответа 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')))обновление
от Панды
0.19.2теперь вы можете просто передать URL-адрес непосредственно.
в последней версии pandas (
0.19.2) вы можете напрямую передать urlimport pandas as pd url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv" c=pd.read_csv(url)
как я уже говорил вам нужно использовать объект StringIO и декодировать т. е.
c=pd.read_csv(io.StringIO(s.decode("utf-8")))при использовании запросов, вам нужно декодировать как .содержимое возвращает байт если вы использовали .текст вам просто нужно будет передать s как естьs = requests.get(url).textc =pd.read_csv(StringIO(s)).более простой подход-передать правильный url raw к
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:
filepath_or_buffer:
строка или дескриптор файла / StringIO Строка может быть URL-адресом. Допустимые схемы URL включают http, ftp, s3 и file. Для URL-адресов файлов ожидается хост. Например, локальный файл может быть file://localhost/path / to / table.csv
проблема, с которой вы столкнулись, заключается в том, что вывод, который вы получаете в переменную 's', является не csv, а html-файлом. Для того, чтобы получить необработанный csv, вы должны изменить url:
'https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv'
ваша вторая проблема заключается в том, что read_csv ожидает имя файла, мы можем решить эту проблему с помощью StringIO из модуля ввода-вывода. Третья проблема-это запрос.get (url).содержание поставляет поток байта, мы может разрешить это с помощью запроса.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
Comments