Панды читать 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)


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




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




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

920   4  

4 ответов:

так же, как ошибка предполагает,pandas.read_csv в качестве первого аргумента требуется файлоподобный объект.

если вы хотите прочитать csv из строки, вы можете использовать io.StringIO (Python 3.х) или 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')))

обновление

от Панды 0.19.2 теперь вы можете просто передать URL-адрес непосредственно.

в последней версии 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)

как я уже говорил вам нужно использовать объект StringIO и декодировать т. е. c=pd.read_csv(io.StringIO(s.decode("utf-8"))) при использовании запросов, вам нужно декодировать как .содержимое возвращает байт если вы использовали .текст вам просто нужно будет передать s как есть s = requests.get(url).text c = pd.read_csv(StringIO(s)).

более простой подход-передать правильный url raw к 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
..................................

С docs:

filepath_or_buffer:

строка или дескриптор файла / StringIO Строка может быть URL-адресом. Допустимые схемы URL включают http, ftp, s3 и file. Для URL-адресов файлов ожидается хост. Например, локальный файл может быть file://localhost/path / to / table.csv

проблема, с которой вы столкнулись, заключается в том, что вывод, который вы получаете в переменную 's', является не csv, а html-файлом. Для того, чтобы получить необработанный csv, вы должны изменить url:

'https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv'

ваша вторая проблема заключается в том, что read_csv ожидает имя файла, мы можем решить эту проблему с помощью StringIO из модуля ввода-вывода. Третья проблема-это запрос.get (url).содержание поставляет поток байта, мы может разрешить это с помощью запроса.get (url).вместо этого текст.

конечный результат этого кода:

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

Comments

    Ничего не найдено.