Панды 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()
Другие вопросы по тегам