Pandas read_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)
У меня есть следующая ошибка
"Ожидаемое имя пути к файлу или файл-подобный объект, полученный тип"
Как я могу это исправить?
Ответы
Ответ 1
Обновить
Из панд 0.19.2
теперь вы можете просто передать URL напрямую.
Как и предполагает ошибка, pandas.read_csv
нуждается в объекте, 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
Пример -
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')))
Ответ 2
В последней версии 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)
Ответ 3
Как я уже говорил, вам нужно использовать объект 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-адрес, t нужны запросы вообще:
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 и файл. Для URL-адресов файлов ожидается хост. Например, локальным файлом может быть файл://localhost/path/to/table.csv
Ответ 4
Проблема, с которой вы сталкиваетесь, заключается в том, что вывод, который вы получаете в переменную '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.
Конечный результат - это код:
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