Панды 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)
У меня следующая ошибка
"Ожидаемый путь к файлу или файлоподобный объект, полученный тип"
Как я могу это исправить?
4 ответа
Как и предполагает ошибка, 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
ответ, а не сырые 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-адрес напрямую.
В последней версии панд (0.19.2
) вы можете напрямую передать URL
import 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")))
если вы используете запросы, вам нужно декодировать как.content возвращает байты, если вы используете.text, вам просто нужно передать s как есть s = requests.get(url).text
с = pd.read_csv(StringIO(s))
,
Более простой подход - передать правильный URL исходных данных напрямую 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
..................................
Из документов:
filepath_or_buffer:
дескриптор строки или файла / StringIO Строка может быть URL-адресом. Допустимые схемы URL включают http, ftp, s3 и file. Для файловых URL-адресов ожидается хост. Например, локальный файл может быть файлом://localhost/path/to/table.csv
Проблема, с которой вы столкнулись, заключается в том, что вывод, который вы получаете в переменную '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
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")
Чтобы импортировать данные через URL-адрес в пандах, просто примените простой приведенный ниже код, он работает лучше.
import pandas as pd
train = pd.read_table("https://urlandfile.com/dataset.csv")
train.head()
Если у вас возникли проблемы с необработанными данными, просто поставьте 'r' перед URL-адресом.
import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()