पंडों ने url से read_csv किया


138

मैं IPython के साथ पायथन 3.4 का उपयोग कर रहा हूं और निम्नलिखित कोड हैं। मैं दिए गए 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 वापस नहीं मिल रहा है एक सीएसवी फ़ाइल नहीं है तो यह काम नहीं करने वाला है
Padraic Cunningham

3
मैं काफी हद तक निश्चित URL चाहता हूँ "https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
kylie.a 14

@venom, सही के रूप में अधिक लोकप्रिय जवाब को चुना
ibodi

जवाबों:


166

अपडेट करें

पांडा से 0.19.2आप अब सीधे url पास कर सकते हैं ।


जैसा कि त्रुटि का सुझाव है, pandas.read_csvपहले तर्क के रूप में फ़ाइल जैसी ऑब्जेक्ट की आवश्यकता है।

यदि आप एक स्ट्रिंग से सीएसवी पढ़ना चाहते हैं, तो आप io.StringIO(पायथन 3.x) या StringIO.StringIOपायथन 2.x का उपयोग कर सकते हैं ।

इसके अलावा, URL के लिए - https://github.com/cs109/2014_data/blob/master/countries.csv - आपको वापस htmlप्रतिक्रिया मिल रही है , कच्ची सीएसवी नहीं, आपको Rawजीआईटीएच पेज में लिंक द्वारा दिए गए यूआरएल का उपयोग करना चाहिए: कच्ची सीएसवी प्रतिक्रिया मिल रही है, जो है - 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')))

क्या होगा यदि प्रतिक्रिया बड़ी है और मैं एन्कोडेड सामग्री, डीकोड की गई सामग्री और स्ट्रिंग ऑब्जेक्ट के लिए मेमोरी का उपभोग करने के बजाय इसे स्ट्रीम करना चाहता हूं?
akaihola

9
पांडा के नवीनतम संस्करण में आप url को सीधे दे सकते हैंc=pd.read_csv(url)
inodb

उत्सुकता से मेरे पास pandas(0.23.4) का एक नया संस्करण है , लेकिन मैं सीधे यूआरएल नहीं दे सकता था। इस जवाब ने मुझे वह काम करने में मदद की।
अंती

1
"पांडा 0.19.2 से अपडेट करें। अब आप सीधे url पास कर सकते हैं।" जब तक आप नहीं कर सकते क्योंकि आपको प्रमाणीकरण तर्क पारित करने की आवश्यकता होती है, जिस स्थिति में मूल उदाहरण की बहुत आवश्यकता होती है।
हारून हॉल

यह समाधान अभी भी मूल्यवान है यदि आपको HTTP कोड का उपयोग करके एक बेहतर त्रुटि से निपटने की आवश्यकता है जिसे अनुरोध ऑब्जेक्ट द्वारा वापस किया जा सकता है (उदाहरण: 500 -> पुनः प्रयास की आवश्यकता हो सकती है, 404 -> कोई पुनः प्रयास नहीं)
JulienV

235

पांडा ( 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 हैंडल नहीं कर सकता है।
मल्टीगुडवर्स 16

पायथन 2 का उपयोग करने वालों के लिए, आपको पायथन 2.7.10+ का उपयोग करना होगा।
ऐवेलिस

प्रतीत होता है कि URL से सीएसवी पढ़ने में कुछ समस्या है। मैंने एक बार स्थानीय भंडारण से और एक बार URL से फ़ाइल पढ़ी, मुझे URL से त्रुटियाँ मिलती रहीं। मैंने तब error_bad_lines = गलत सक्षम किया और 99% से अधिक डेटा को अनदेखा कर दिया गया था। URL लिंक है । एक बार जब मैंने फाइल पढ़ी, तो डेटासेट का आकार (88,1) पाया गया, जो पूरी तरह से गलत है
ऋषिक मणि

10

जैसा कि मैंने टिप्पणी की आप एक StringIO वस्तु और उपयोग करने की आवश्यकता डिकोड यानी c=pd.read_csv(io.StringIO(s.decode("utf-8")))अगर अनुरोध का उपयोग कर, आप डिकोड करने की जरूरत है .Content रिटर्न के रूप में बाइट्स यदि आप .text तुम सिर्फ रों पारित करने के लिए के रूप में है की आवश्यकता होगी इस्तेमाल किया s = requests.get(url).textग = pd.read_csv(StringIO(s))

एक सरल दृष्टिकोण का सही यूआरएल पारित करने के लिए है कच्चे डेटा के लिए सीधे read_csv, तो आप नहीं है वस्तु की तरह एक फ़ाइल पारित करने के लिए है, तो आप ताकि आप सभी पर अनुरोध की जरूरत नहीं है एक यूआरएल पारित कर सकते हैं:

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 :

स्ट्रिंग या फ़ाइल संभाल / स्ट्रिंग स्ट्रिंग एक URL हो सकता है। मान्य URL योजनाओं में http, ftp, s3 और फ़ाइल शामिल हैं। फ़ाइल URL के लिए, एक होस्ट अपेक्षित है। उदाहरण के लिए, एक स्थानीय फ़ाइल फ़ाइल हो सकती है: //localhost/path/to/table.csv


1
आप url को सीधे पंडों को read_csv पर खिला सकते हैं! बेशक! जो मैंने पाया, उससे कहीं ज्यादा सरल उपाय है! : D
पाबोररे

1
@pabtorre, yep, डॉक्स क्यों पढ़ रहे हैं इसका एक उदाहरण एक अच्छा विचार है।
पादरी कनिंघम

6

आपके पास समस्या यह है कि चर 's' में आपको प्राप्त होने वाला आउटपुट एक सीएसवी नहीं है, लेकिन एक html फ़ाइल है। कच्ची सीएसवी प्राप्त करने के लिए, आपको यूआरएल को संशोधित करना होगा:

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

आपकी दूसरी समस्या यह है कि read_csv एक फ़ाइल नाम की अपेक्षा करता है, हम इसे 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

पंडों में यूआरएल के माध्यम से डेटा आयात करने के लिए बस सरल नीचे दिए गए कोड को लागू करें यह वास्तव में बेहतर काम करता है।

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

यदि आप एक कच्चे डेटा के साथ समस्या कर रहे हैं तो बस URL से पहले 'r' डालें

import pandas as pd
train = pd.read_table(r"https://urlandfile.com/dataset.csv")
train.head()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.