복붙노트

[PYTHON] URL에서 Pandas read_csv

PYTHON

URL에서 Pandas read_csv

나는 파이썬 3.4를 IPython과 함께 사용하고 있으며 다음과 같은 코드를 가지고있다. 주어진 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)

다음 오류가 있습니다.

이 문제를 어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.오류가 암시 하듯이 pandas.read_csv에는 파일과 비슷한 객체가 첫 번째 인수로 필요합니다.

    오류가 암시 하듯이 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)에 대해 원시 csv가 아닌 HTML 응답을 받고 있으므로 github의 Raw 링크에서 지정한 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')))
    

    판다 0.19.2부터는 URL을 직접 전달할 수 있습니다.

  2. ==============================

    2.팬더의 최신 버전 (0.19.2)에서 직접 URL을 전달할 수 있습니다

    팬더의 최신 버전 (0.19.2)에서 직접 URL을 전달할 수 있습니다

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

    3.당신이 StringIO 객체를 사용해야하고 요청을 사용하는 경우 즉 c = pd.read_csv (io.StringIO (s)) 요청을 사용하는 경우 .content가 바이트를 반환 할 필요가 있다고 해봅시다. .text를 사용하면 s = requests.get (url) .text c = pd.read_csv (StringIO)와 같이 s를 전달하면됩니다.

    당신이 StringIO 객체를 사용해야하고 요청을 사용하는 경우 즉 c = pd.read_csv (io.StringIO (s)) 요청을 사용하는 경우 .content가 바이트를 반환 할 필요가 있다고 해봅시다. .text를 사용하면 s = requests.get (url) .text c = 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 :

  4. ==============================

    4.문제는 변수 's'에 출력되는 결과가 csv가 아니라 html 파일이라는 것입니다. 원시 csv를 가져 오려면 다음과 같이 URL을 수정해야합니다.

    문제는 변수 '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
    
  5. from https://stackoverflow.com/questions/32400867/pandas-read-csv-from-url by cc-by-sa and MIT license