Я использую 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)
У меня следующая ошибка
«Ожидаемый путь к файлу или файлоподобный объект, полученный тип»
Как я могу это исправить?
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
но вы получаете html обратно, а не файл CSV, поэтому он не будет работать"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
.Ответы:
Обновить
Из панд
0.19.2
теперь вы можете просто передать URL напрямую .Как и следует из ошибки,
pandas.read_csv
в качестве первого аргумента необходим файлоподобный объект.Если вы хотите прочитать csv из строки, вы можете использовать
io.StringIO
(Python 3.x) или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Пример -
источник
c=pd.read_csv(url)
pandas
(0.23.4), но я не мог дать URL-адрес напрямую. Этот ответ помог мне получить эту работу.В последней версии панд (
0.19.2
) вы можете напрямую передать URLисточник
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
из-за протокола https, который urllib не может обработать.Как я уже говорил, вам нужно использовать объект StringIO и декодировать, т.е.
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
если вы используете запросы, вам нужно декодировать как .content возвращает байты, если вы используете .text, вам просто нужно передать s какs = requests.get(url).text
c =pd.read_csv(StringIO(s))
.Более простой подход - передать правильный URL-адрес необработанных данных напрямую
read_csv
, вам не нужно передавать файл, подобный объекту, вы можете передать URL-адрес, чтобы вам вообще не нужны запросы:Вывод:
Из документов :
filepath_or_buffer :
источник
Проблема, с которой вы столкнулись, заключается в том, что вывод, который вы получаете в переменную 's', - это не CSV, а HTML-файл. Для того, чтобы получить сырой CSV, вы должны изменить URL:
' Https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv '
Ваша вторая проблема заключается в том, что read_csv ожидает имя файла, мы можем решить это, используя StringIO из модуля io. Третья проблема заключается в том, что request.get (url) .content доставляет поток байтов, мы можем решить эту проблему, используя вместо этого request.get (url) .text.
Конечный результат - это код:
вывод:
источник
источник
источник