Панди read_csv з URL-адреси


138

Я використовую 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)

У мене є така помилка

"Очікуване ім'я шляху файлу або схожий на файл об'єкт, отримано тип"

Як я можу це виправити?


Вам знадобиться щось на кшталт, c=pd.read_csv(io.StringIO(s.decode("utf-8")))але ви отримуєте html назад, а не файл CSV, тому він не працюватиме
Padraic Cunningham

3
Я впевнений, що потрібна URL-адреса "https://raw.github.com/cs109/2014_data/blob/master/countries.csv".
kylie.a

@venom вибрав більш популярну відповідь як правильну
ibodi

Відповіді:


166

Оновлення

Від панд 0.19.2тепер ви можете просто передати URL-адресу безпосередньо .


Так само, як свідчить про помилку, 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')))

Що робити, якщо відповідь велика, і я хочу передавати її замість того, щоб витрачати пам'ять на кодований контент, декодований вміст та об'єкт StringIO?
akaihola

9
В останній версії панди ви можете надіслати URL безпосередньо, тобтоc=pd.read_csv(url)
inodb

Цікаво, що у мене є новіша версія pandas(0.23.4), але я не зміг дати URL-адресу безпосередньо. Ця відповідь допомогла мені працювати.
Антті

1
"Оновлення з панд 0.19.2 тепер ви можете просто передати URL безпосередньо." Якщо ви не можете, тому що вам потрібно передавати аргументи автентифікації, і в цьому випадку оригінальний приклад дуже потрібен.
Аарон Холл

Це рішення все ще цінне, якщо вам потрібно краще обробляти помилки за допомогою HTTP-кодів, які можуть бути повернені об'єктом запиту (наприклад: 500 -> повтор може знадобитися, 404 -> не
намагайтеся

235

В останній версії 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)

здається, що при використанні цього безпосередньо замість запитів безпосередньо не використовується кеш запитів, навіть якщо він використовується
shadi

5
Цей код повертається urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>через протокол https, який urllib не може обробити.
багатоповерховий

Для тих, хто використовує Python 2, вам доведеться використовувати Python 2.7.10+.
avelis

Здається, існує проблема з читанням CSV з URL-адреси. Я читав файл один раз з локальної пам’яті та один раз з URL-адреси, я постійно отримував помилки з URL. Потім я ввімкнув error_bad_lines = Неправдиво, і більше 99% даних було проігноровано. URL-адреса - посилання . Як тільки я прочитав файл, було виявлено форму набору даних (88,1), що абсолютно неправильно
Rishik Mani

10

Як я помітив , що вам потрібно використовувати об'єкт StringIO і розшифровує тобто c=pd.read_csv(io.StringIO(s.decode("utf-8")))при використанні запитів, вам необхідно декодувати , як .content повертає байт , якщо використовується .text вам просто потрібно буде проходити сек як 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 та файл. Для URL-адрес файлів очікується хост. Наприклад, локальним файлом може бути файл: //localhost/path/to/table.csv


1
Ви можете подати URL безпосередньо в pandas read_csv! звичайно! це набагато простіше рішення, ніж те, що я знайшов! : D
PabTorre

1
@pabtorre, так, приклад того, чому читати документи - хороша ідея.
Padraic Cunningham

6

Проблема у вас полягає в тому, що вихід, який ви потрапляєте у змінну '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


0

Щоб імпортувати дані через 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.