URL'den pandalar read_csv


139

IPython ile Python 3.4 kullanıyorum ve aşağıdaki kodu var. Belirtilen URL'den bir csv dosyasını okuyamıyorum:

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)

Aşağıdaki hatayla karşılaştım

"Beklenen dosya yolu adı veya dosya benzeri bir nesne, tür var"

Bunu nasıl düzeltebilirim?


Gibi bir şeye ihtiyacınız var c=pd.read_csv(io.StringIO(s.decode("utf-8")))ama html geri değil bir csv dosyası alıyorsunuz, bu yüzden işe yaramayacak
Padraic Cunningham

3
İstediğiniz URL'nin olduğundan eminim "https://raw.github.com/cs109/2014_data/blob/master/countries.csv".
kylie.a

@venom, doğru olanı olarak daha popüler cevabı seçti
ibodi

Yanıtlar:


167

Güncelleme

Pandalardan 0.19.2artık URL'yi doğrudan geçebilirsiniz .


Hatanın önerdiği pandas.read_csvgibi, ilk argüman olarak dosya benzeri bir nesneye ihtiyaç duyar.

Bir dizeden csv'yi okumak istiyorsanız, io.StringIO(Python 3.x) veya StringIO.StringIO(Python 2.x) kullanabilirsiniz .

Ayrıca, URL için - https://github.com/cs109/2014_data/blob/master/countries.csv - htmlham csv yerine geri yanıt alıyorsunuz Rawiçin, github sayfasındaki bağlantı tarafından verilen URL'yi ham csv yanıtı almak - https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv

Misal -

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')))

Yanıt büyükse ve kodlanmış içerik, kod çözülmüş içerik ve StringIO nesnesi için bellek tüketmek yerine bu iletiyi yayınlamak istiyorsam ne olur?
akaihola

9
Pandaların son sürümünde doğrudan url verebilirsinizc=pd.read_csv(url)
inodb

İlginçtir ki pandas(0.23.4) 'ün yeni bir versiyonuna sahibim, ancak url'yi doğrudan veremedim. Bu cevap, çalışmamı sağladı.
Antti

1
"Güncelleme Pandalar 0.19.2 şimdi url doğrudan doğrudan geçebilirsiniz." Kimlik doğrulama argümanlarını iletmeniz gerektiğinden yapamazsanız, bu durumda orijinal örnek çok gereklidir.
Aaron Hall

İstek nesnesi tarafından döndürülebilecek HTTP kodlarını kullanarak daha iyi bir hata işlemeye ihtiyacınız varsa bu çözüm yine de değerlidir (ör: 500 -> yeniden deneme gerekebilir, 404 -> yeniden deneme gerektirmez)
JulienV

236

Pandaların ( 0.19.2) en son sürümünde doğrudan URL'yi iletebilirsiniz

import pandas as pd

url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)

Görünüşe göre bu isteklerin yerine doğrudan kullanıldığında bile istek-önbellek kullanılmıyor
shadi

5
Bu kod urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>, urllib'in işleyemediği https protokolü nedeniyle döndürülür.
multigoodverse

Python 2 kullananlar için Python 2.7.10+ kullanmanız gerekecektir.
avelis

Bir URL'den csv okunurken bazı sorunlar var gibi görünüyor. Dosyayı yerel depolama alanından bir kez okudum ve URL'den bir kez URL'den hata almaya devam ettim. Daha sonra error_bad_lines = False özelliğini etkinleştirdim ve verilerin% 99'undan fazlası yoksayıldı. URL bağlantıdır . Dosyayı okuduktan sonra, veri kümesinin şekli (88,1) olarak bulundu, ki bu tamamen yanlış
Rishik Mani

10

Sana bir StringIO nesnesi ve çözmek yani kullanmak zorunda yorumladığı gibi c=pd.read_csv(io.StringIO(s.decode("utf-8")))istekleri kullanarak eğer .content döner gibi, sen decode gereken bayt sadece olduğu gibi s geçmesi gerekir .text kullandığınız takdirde s = requests.get(url).textc =pd.read_csv(StringIO(s)) .

Daha basit bir yaklaşım doğru url geçmektir ham doğrudan veri read_csvEğer yok sen hiç isteklerini gerek kalmaz nesne gibi bir dosya geçmek zorunda, bir url geçirebilirsiniz:

c = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")

print(c)

Çıktı:

                              Country         Region
0                             Algeria         AFRICA
1                              Angola         AFRICA
2                               Benin         AFRICA
3                            Botswana         AFRICA
4                             Burkina         AFRICA
5                             Burundi         AFRICA
6                            Cameroon         AFRICA
..................................

Gönderen docs :

filepath_or_buffer :

string veya file handle / StringIO Dize bir URL olabilir. Geçerli URL şemaları http, ftp, s3 ve dosyayı içerir. Dosya URL'leri için bir ana bilgisayar bekleniyor. Örneğin, yerel bir dosya şu dosya olabilir: //localhost/path/to/table.csv


1
URL'yi doğrudan pandalara read_csv'ye besleyebilirsiniz! elbette! bu bulduğumdan çok daha basit bir çözüm! : D
PabTorre

1
@pabtorre, evet, dokümanları okumanın neden iyi bir fikir olduğunu gösteren bir örnek.
Padraic Cunningham

6

Sahip olduğunuz sorun 's' değişkenine aldığınız çıktının bir csv değil, bir html dosyası olmasıdır. Ham csv'yi almak için, URL'yi şu şekilde değiştirmeniz gerekir:

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

İkinci sorununuz, read_csv'nin bir dosya adı beklemesi, bunu io modülünden StringIO kullanarak çözebiliriz. Üçüncü sorun, request.get (url) .content öğesinin bir bayt akışı sağlamasıdır, bunun yerine request.get (url) .text öğesini kullanarak bunu çözebiliriz.

Sonuç şu kod:

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))

çıktı:

>>> c.head()
    Country  Region
0   Algeria  AFRICA
1    Angola  AFRICA
2     Benin  AFRICA
3  Botswana  AFRICA
4   Burkina  AFRICA

2
url = "https://github.com/cs109/2014_data/blob/master/countries.csv"
c = pd.read_csv(url, sep = "\t")

Lütfen çözümünüzün nasıl çalıştığını açıklayınız.
Selim Yıldız

0

Pandalar'da URL yoluyla Veri Almak için, aslında daha iyi çalışan aşağıdaki basit kodu uygulayın.

import pandas as pd
train = pd.read_table("https://urlandfile.com/dataset.csv")
train.head()

Ham verilerle ilgili sorun yaşıyorsanız URL'nin önüne 'r' koyun

import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.