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