URL에서 팬더 read_csv


138

IPython과 함께 Python 3.4를 사용하고 있으며 다음 코드가 있습니다. 주어진 URL에서 csv 파일을 읽을 수 없습니다 :

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")))하지만 csv 파일이 아닌 html을 다시 가져 와서 작동하지 않을 것입니다.
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 : html//github.com/cs109/2014_data/blob/master/countries.csv-원시 csv가 아닌 응답을 받고 있습니다 Raw. github 페이지 의 링크에서 제공 한 URL 을 이다 원시 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을 제공 할 수 없습니다. 이 답변은 그 일을하는 데 도움이되었습니다.
Antti

1
"pandas 0.19.2에서 업데이트하면 URL을 바로 전달할 수 있습니다." 인증 인수를 전달할 필요가없는 경우가 아니면 원래 예제가 많이 필요합니다.
Aaron Hall

이 솔루션은 요청 객체가 반환 할 수있는 HTTP 코드를 사용하여 더 나은 오류 처리가 필요한 경우에도 여전히 유용합니다 (예 : 500-> 재시도 필요,
404-

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)>urllib이 처리 할 수없는 https 프로토콜 로 인해 반환 됩니다.
multigoodverse

Python 2를 사용하는 사용자는 Python 2.7.10+를 사용해야합니다.
avelis

URL에서 csv를 읽는 데 문제가있는 것 같습니다. 로컬 저장소에서 한 번, URL에서 한 번 파일을 읽으면 URL에서 계속 오류가 발생합니다. 그런 다음 error_bad_lines = False를 활성화했으며 99 % 이상의 데이터가 무시되었습니다. URL은 링크 입니다. 내가 파일을 읽을되면, 데이터 세트의 모양이 완전히 잘못이다, (88,1)로 밝혀졌다
Rishik 마니

10

내가 언급했듯이 StringIO 객체를 사용해야하고 c=pd.read_csv(io.StringIO(s.decode("utf-8")))요청 을 사용하는 경우 디코딩 해야합니다. 즉 , .text를 사용하면 .content가 바이트를 반환하므로 디코딩 해야합니다 s = requests.get(url).text.c = 그대로 s를 전달하면됩니다 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 및 file이 포함됩니다. 파일 URL의 경우 호스트가 필요합니다. 예를 들어, 로컬 파일은 : //localhost/path/to/table.csv 파일 일 수 있습니다.


1
URL을 팬더에게 직접 읽을 수 있습니다. read_csv! 물론이야! 그것은 내가 찾은 것보다 훨씬 간단한 해결책입니다! : D
PabTorre

1
@pabtorre, yep, 문서를 읽는 것이 좋은 이유의 예입니다.
Padraic Cunningham

6

문제는 변수 's'에 들어가는 출력이 csv가 아니라 html 파일이라는 것입니다. 원시 CSV를 얻으려면 URL을 다음과 같이 수정해야합니다.

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

두 번째 문제는 read_csv에 파일 이름이 필요하다는 것입니다 .io 모듈에서 StringIO를 사용하여이 문제를 해결할 수 있습니다. 세 번째 문제는 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

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

솔루션 작동 방식에 대한 설명을 입력하십시오.
셀림 일 디즈

0

팬더에서 URL을 통해 데이터를 가져 오려면 간단한 아래 코드를 적용하면 실제로 더 잘 작동합니다.

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.