Подтвердить что ты не робот

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)

У меня есть следующая ошибка

"Ожидаемое имя пути к файлу или файл-подобный объект, полученный тип"

Как я могу это исправить?

4b9b3361

Ответ 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