기타/공부노트

[Python / request] request를 이용해 csv파일 가져오기.

코드아키택트 2021. 1. 18. 17:06
반응형

개요

 오늘은 request를 이용해서 csv 파일을 가져와보도록 하겠습니다.

 

 

 

발단 : wget 사용불가

 요즘 배우는 머신러닝 예제 중, wget을 이용해서 csv를 다운로드 받아야 하는 부분이 있었습니다. 그래서 우선 wget을 이용해 보기로 했습니다.

!wget 이라는 방식으로 다운로드 받는다. 하지만 리눅스용 방식인 듯 하다.

 

 

wget 기본구문

import wget

print('Beginning file download with wget module')

url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
wget.download(url, 'cat4.jpg')

wget은 매우 간단했습니다. 위의 스크린 캡쳐는 왜 !wget인지 잘 모르겠지만. 순서는 다음과 같이 볼 수 있습니다.

  • 라이브러리를 임포트한다

  • 인터넷상의 url을 지정한다

  • 로컬로 다운로드한다.

 위의 예제는 작동합니다.

 

작동 직전. cat4.jpg파일은 없는 것을 확인.

 

테스트하느라 두번실행.

 

 

wget csv 시도 : 404에러

import wget

print('Beginning file download with wget module')

url = 'https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/data/FuelConsumptionCo2.csv'
wget.download(url, 'FuelConsumptionCo2.csv')

->url을 변경했으며, download안의 파일타입을 csv로 바꿨습니다.

 

실행결과

urllib.error.HTTPError: HTTP Error 404: Not Found

->404에러가 납니다. 즉 url이 존재하지 않는다는 뜻인데, 실제로 저 url을 들어가보면 파일이 존재합니다. 해결할 수 없어 우회하기로 합니다.

 

 

 

해결 : requests.get(url)사용

import requests

print('Beginning file download with requests module')

url = "https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/data/FuelConsumptionCo2.csv"
req = requests.get(url)
url_content = req.content
csv_file = open('FuelConsumption.csv','wb')
csv_file.write(url_content)
csv_file.close()

만약 위의 코드를 쓰신다면 , url부분만 수정하시면 됩니다.

 

 

실행전. csv는 존재하지 않음.
실행 후 다운로드 받아진 걸 볼 수 있음.

 

 

이해하기 csv 생성 과정과 'wb'?

중간에 보시면 'wb'라는 부분이 있습니다. 아래는 각 문자에 대한 설명입니다. 이 친구는 무슨 뜻 일까요?

Character Meaning
--------- ---------------------------------------------------------------
'r'       open for reading (default)
'w'       open for writing, truncating the file first
'x'       create a new file and open it for writing
'a'       open for writing, appending to the end of the file if it exists
'b'       binary mode
't'       text mode (default)
'+'       open a disk file for updating (reading and writing)
'U'       universal newline mode (deprecated)

 

 이것을 이야기하려면 csv가 만들어지는 과정을 얘기해야 할 것 같습니다.

과정

  1. csv를 연다

  2. 내용을 입힌다

  3. 저장한다.

 이 1번의 과정에서 모드를 설정해주어야 합니다. csv를 만들때 문제가 되는 점들은 이런 모드를 잘못 설정하거나, 마지막에 close()를 해주지 않아서 제대로 실행되지 않는 경우들이 있었습니다. 'w'가 붙는 이유는 내용을 덮어쓰기 위한건 알겠는데, 'b'의 의미는 저도 찾아봐야 겠습니다.

 

 

응용하기: `.`과`..`을 통해 상대위치(relative path)해보기

 

`..`활용

파일 위치에 ..을 붙여 상위 폴더임을 표시
생성된 모습

 위의 폴더 구조는 Programming -> wget -> wgetTest.py로 되어 있습니다. 그래서 현재 위치는 Programming -> wget 입니다. 프로젝트 특성에 따라서 현재 실행되는 파일을 기준으로 그 하나 위 또는 아래등등의 위치를 지정해줘야  하는 경우가 있습니다. Linux의 vim를 이용하면 미치도록 많이 사용할 수 있던데, 한번 응용해보고 싶었습니다.

 

`.`활용

.을 붙임
현재 위치를 기준으로 하위폴더를 생성하고 파일을 생성하려 했지만 에러가났음.
직접 폴더를 만든후 실행하니 생성됨.

 마찬가지로 폴더 위치를 지정할때 `.`은 현재 위치를 뜻합니다. 위의 경우 'FuelConsumption.csv'는 './FuelConsumption.csv'와 같은 의미를 가집니다. 이를 이용해 하위폴더에도 파일을 저장할 수 있습니다. 단, 폴더가 생성되어 있지않으면 에러가 뜨네요.

 

 

참고사이트


stackabuse.com/download-files-with-python/

반응형