[python] URL에서 팬더 read_csv

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)

다음과 같은 오류가 있습니다

“예상 된 파일 경로 이름 또는 파일과 유사한 객체, 유형이 있음”

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



답변

최신 정보

팬더에서 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')))


답변

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

import pandas as pd

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


답변

내가 언급했듯이 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 파일 일 수 있습니다.


답변

문제는 변수 ‘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


답변

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


답변

팬더에서 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()


답변