지금까지 아래와 같은 내용들을 살펴보았습니다.
- 출력문: print
- 변수 할당
- 반복문: for
- 조건문: if
그리고, 아래와 같은 자료형을 배웠습니다:
- 상수형 자료형: 참/거짓
- 숫자형 자료형: 정수, 소수
- 시퀀스형 자료형: 리스트(list), 튜플(tuple)
- 텍스트 시퀀스: 문자열
- 바이트 시퀀스: 바이트 (bytes)
- 컨테이너형 자료형: set, dict
그리고, 아래 내용들을 배웠습니다:
- 파일 다루기: 파일에 쓰기, 파일에서 읽어오기
- 함수
- 클래스
또, 중간 중간 등장한 내용들도 있습니다
- 웹에서 문서 가져오기: requests
우선, 여러분들이 지난 3일간의 내용을 잘 이해하고 있는지 점검해보기 위해, Python 기초 퀴즈 한번 풀어보세요.
1일차에는 출력문, 변수 할당, 반복문, 조건문을 살펴봤습니다.
출력문은 print() 함수를 사용했습니다. 간단하죠.
print('Hello')Hello
변수 할당은 = 기호를 사용합니다.
a = 10
a = a + 30
print(a)50
반복문 중 for 문은 아래와 같이 사용합니다.
for i in range(10):
print(i)for 문의 얼개는 다음과 같습니다.
for var in B:
반복할 동안 수행하고자 하는 명령들
for 문은 조건에 의해 도중에 중단할 수도 있는데, break 명령을 사용합니다.
for i in range(10):
if i > 5:
break조건문에는 if 문이 있으며, 아래와 같이 사용합니다.
if condition:
# condition이 참일 경우 수행할 구문들
# condition이 참일 경우 수행할 구문들condition 부분에는 변수나 수식이 올 수 있으며, 참일 경우 하위 구문들을 수행합니다.
if 문은 else 와 함께 사용할 수 있습니다.
if condition:
# condition이 참일 경우 수행할 구문들
# condition이 참일 경우 수행할 구문들
else:
# condition이 거짓일 경우 수행할 구문들2일차에는 자료형을 중심으로 살펴봤습니다.
True, False, None 과 같은 참, 거짓, 그리고 없음을 나타내는 상수값이 있다는 것을 배웠습니다.
숫자형 자료형에는 정수(integer), 소숫점을 가지는 실수(float)가 있다는 것을 배웠습니다.
목록을 만들기 위해서는 리스트(list) 자료형을 사용합니다.
[1, 2, 3, 4]리스트는 위와 같이 대괄호([]) 안에 원소들을 기재합니다.
리스트에 대해서는 아래와 같이 위치 참조, 슬라이싱을 할 수 있습니다.
data = [1, 2, 3, 4]
data[0] # 맨 첫 원소: 1
data[-1] # 맨 끝 원소: 4
data[:2] # 맨 처음부터 2번 위치까지: [1, 2]
data[:-1] # 맨 뒤 원소 빼고: [1, 2, 3]
data[2:] # 2번 위치부터 맨 끝까지: [3, 4]
5 in data # 5가 data의 원소인지 여부: False리스트에 대해 사용할 수 있는 주요 메소드들은 아래와 같은 것들이 있습니다:
- append(x)
- 리스트의 맨 뒤에 새로운 원소를 추가한다.
집합은 유일한 원소들만으로 구성된 자료형입니다.
set()
set([1, 2, 3, 4])집합은, 위와 같이 set() 함수로 빈 집합을 생성하거나, 리스트를 set() 함수로 감싸서 생성할 수 있습니다.
집합에 대해 사용할 수 있는 주요 메소드들은 아래와 같은 것들이 있습니다:
- add(x)
- 집합에 새로운 원소를 추가한다
사전(dict)은 참조 이름과 값으로 이루어진 자료형입니다.
dict()
{'Tom': 15, 'Mary': 20}사전은 위와 같이 dict() 함수로 빈 사전을 만들거나, 중괄호({})를 사용해서 데이터를 지정하여 생성할 수 있습니다.
사전의 특정 값을 참조할 때는, 리스트에서 했듯이 대괄호([])로 원소를 참조할 수 있습니다.
a = {'Tom': 15, 'Mary': 20}
a['Tom'] # Tom의 값을 가져온다: 15
a['John'] = 10 # John에 10을 저장한다사전에 대해 사용할 수 있는 주요 메소드들은 아래와 같은 것들이 있습니다:
- keys()
- 사전에 존재하는 모든 키(참조이름) 목록을 가져온다.
- values()
- 사전에 존재하는 모든 값 목록을 가져온다.
- items()
- 사전에 존재하는 키, 값 쌍의 목록을 가져온다.
문자열은 작은 따옴표(‘)나 큰 따옴표(“)로 둘러싸서 만들 수 있습니다.
data = 'Hello Python'
data = "Hello Python"문자열은 리스트와 많은 특징을 공유합니다.
data = 'Hello Python'
data[0] # 첫번째 문자: H
data[-1] # 마지막 문자: n
data[:5] # 처음부터 5번째 원소까지: Hello
'Hello' in data # data에 Hello라는 문자열이 포함되어 있는지 여부: True문자열에 대해 사용할 수 있는 주요 메소드들은 아래와 같은 것들이 있습니다:
- split(delim=’ ‘)
- 문자열을 주어진 구분문자를 기준으로 잘라 리스트로 만든다. 구분문자가 없으면 공백을 사용한다.
- join(lst)
- 주어진 리스트의 각 원소를, 원래 문자열을 중간중간 삽입하며 이어붙인다.
- replace(orig, new)
- 문자열에서, 특정 문자를 새로운 문자로 치환하여 반환한다.
- startswith(s)
- 문자열이, 특정 문자열로 시작하는지 여부를 반환한다.
- endswith(s)
- 문자열이, 특정 문자열로 끝나는지 여부를 반환한다.
- find(s)
- 문자열에서 특정 문자가 처음 등장하는 위치를 반환한다.
3일차에는 함수, 클래스, 파일 입출력을 살펴봤습니다.
함수는 다음과 같이 선언할 수 있습니다.
def hello(name, subject='Python'):
print(name + ' is studing ' + subject)클래스는 다음과 같이 선언할 수 있습니다.
class Person:
def __init__(self, name):
self.name = name
def greeting(self):
print('Hi, I am ' + self.name)클래스는 다음과 같이 생성하고 사용할 수 있습니다.
p1 = Person('Park')
p1.greeting()
p2 = Person('Kim')
p2.greeting()아래와 같이 파일을 읽어들일 수 있습니다.
with open(filepath, encoding='utf8') as fin:
content = fin.read()
print(content)open 함수에 ‘w’ 인자를 주면 기록을 위해 파일을 열 수 있습니다.
with open(filepath, 'w', encoding='utf8') as fout:
fout.write('Hello\n')웹에서 데이터를 가져오는 방법을 간단히 소개했습니다. requests 라는 모듈을 불러들여 사용했지요.
import requests
url = 'https://raw.githubusercontent.com/toracle/python-basic-lecture/master/assets/day1-example-read.txt'
response = requests.get(url)
print(response.text)ID,Sex,Age,Programming?,Python? 1,M,25,T,T 2,F,27,T,F 3,F,24,F,F 4,F,25,T,T 5,M,32,F,F 6,M,39,T,F
for문, if문, dict문 등을 종합적으로 활용해보도록 하겠습니다.
이번에는, 국토교통부에서 배포하는 주택 실거래가 데이터를 가져와서 사용하겠습니다.
먼저 데이터를 한번 살펴볼까요?
파일 상단에 여러 안내 문구가 들어있고, 좀더 아래로 내려가면 실제 데이터가 등장합니다.
"시군구","번지","본번","부번","단지명","전용면적(㎡)","계약년월","계약일","거래금액(만원)","층","건축년도","도로명" "서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.35","201801","11~20","63,000","13","2003","오금로" "서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.85","201801","21~31","64,000","5","2003","오금로" "서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.35","201803","21~31","69,500","17","2003","오금로"
이 데이터를 가지고, 면적별, 계약연월별, 단지별 등으로 평균 가격을 살펴보고, 그래프로 그려보는 작업을 해보겠습니다.
우선, 이 데이터를 아래와 같이 불러오겠습니다.
import requests
url = 'https://raw.githubusercontent.com/toracle/python-basic-lecture/master/assets/아파트(매매)__실거래가_20180704110406.csv'
response = requests.get(url)
response.encoding = 'euckr'
content = response.text
print(content[:300])"□ 본 서비스에서 제공하는 정보는 법적인 효력이 없으므로 참고용으로만 활용하시기 바라며, 외부 공개시에는 반드시 신고일 기준으로 집계되면 공식통계를 이용하여 주시기 바랍니다." "□ 신고정보가 실시간 변경, 해제되어 제공시점에 따라 공개건수 및 내용이 상이할 수 있는 점 참고하시기 바랍니다." "□ 본 자료는 계약일 기준입니다. (※ 7월 계약, 8월 신고건 → 7월 거래건으로 제공)" "□ 통계자료 활용시에는 수치가 왜곡될 수 있으니 참고자료로만 활용하시기 바라며, 외부 공개시에는 반드시 신고일 기준으로 집계되는 공식통계를
이 데이터를 행과 열로 구분하여 불러들이겠습니다. 이 작업을 위해서, csv 모듈을 불러들여 사용하겠습니다.
csv 모듈은, 쉼표로 구분된 CSV 파일을 손쉽게 사용할 수 있게 도와주는 모듈입니다. 대개의 경우 파일을 읽어들일 때 아래와 같이 사용합니다.
import csv
with open('mydata.txt') as fin:
reader = csv.reader(fin)
for row in reader:
print(row)파일을 열고, 열려진 파일을 csv.reader() 함수에게 넘겨주면, reader 라는 객체를 반환합니다. 그 reader~를 ~for 구문을 통해 순회할 수 있습니다.
import csv
import requests
url = 'https://raw.githubusercontent.com/toracle/python-basic-lecture/master/assets/아파트(매매)__실거래가_20180704110406.csv'
response = requests.get(url)
response.encoding = 'euckr'
num_lines = 0
price_list = []
content = response.text.splitlines()
reader = csv.reader(content)
for cols in reader:
num_lines = num_lines + 1
if num_lines < 17:
continue
apt_name = cols[4]
area = float(cols[5])
yearmonth = cols[6]
price = int(cols[8].replace(',', ''))
print(apt_name, area, yearmonth, price)
# print(cols)open 함수를 통해 파일을 불러들일 때는 단지 for line fin: 명령만으로 한 줄씩 순회할 수 있었는데, requests 에서 내용을 한줄씩 순회하려면, iter_lines() 메소드를 사용해야 합니다.
그리고, 그렇게 읽어들인 각 line은 인코딩이 지정되어 있지 않아서 한글이 깨지는 상태이기 때문에, euc-kr 인코딩으로 한글을 올바로 읽어들입니다.
파일 상단에는 불필요한 내용들이 들어가 있습니다. 이런 내용들은 분석에 사용하지 않으려 합니다. 17행 미만은 처리하지 않습니다.
import requests
url = 'https://raw.githubusercontent.com/toracle/python-basic-lecture/master/assets/아파트(매매)__실거래가_20180704110406.csv'
response = requests.get(url, stream=True)
num_lines = 0
for line in response.iter_lines():
num_lines = num_lines + 1
if num_lines < 17:
continue
if num_lines > 25: break # 결과값이 너무 길어지는 것을 방지하기 위해, 몇 줄만 출력하고 중단하도록 함.
print(line.decode('euckr'))"서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.35","201801","11~20","63,000","13","2003","오금로" "서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.85","201801","21~31","64,000","5","2003","오금로" "서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.35","201803","21~31","69,500","17","2003","오금로" "서울특별시 송파구 가락동","166-2","0166","0002","sk파크타워","84.88","201804","1~10","64,900","3","2003","오금로" "서울특별시 송파구 가락동","140","0140","0000","가락(1차)쌍용아파트","59.92","201801","1~10","60,800","24","1997","동남로" "서울특별시 송파구 가락동","140","0140","0000","가락(1차)쌍용아파트","59.92","201801","1~10","62,700","4","1997","동남로"
이제 이 중에서, 가장 처음 등장하는 sk파크타워 아파트의 가격을 한번 수집해볼까요?
import csv
import requests
url = 'https://raw.githubusercontent.com/toracle/python-basic-lecture/master/assets/아파트(매매)__실거래가_20180704110406.csv'
response = requests.get(url)
response.encoding = 'euckr'
num_lines = 0
price_list = []
content = response.text.splitlines()
reader = csv.reader(content)
for cols in reader:
num_lines = num_lines + 1
if num_lines < 17:
continue
if num_lines > 25: break # 결과값이 너무 길어지는 것을 방지하기 위해, 몇 줄만 출력하고 중단하도록 함.
apt_name = cols[4]
area = cols[5]
yearmonth = cols[6]
price = cols[8]
print(apt_name, area, yearmonth, price)
# print(cols)sk파크타워 84.35 201801 63,000 sk파크타워 84.85 201801 64,000 sk파크타워 84.35 201803 69,500 sk파크타워 84.88 201804 64,900 가락(1차)쌍용아파트 59.92 201801 60,800 가락(1차)쌍용아파트 59.92 201801 62,700 가락(1차)쌍용아파트 59.92 201801 59,600 가락(1차)쌍용아파트 84.69 201801 74,000 가락(1차)쌍용아파트 84.69 201801 70,000
위에서는, csv 모듈을 requests와 함께 사용하기 위해서, 본문 텍스트를 splitlines() 함수를 사용하여 행으로 미리 잘라주었습니다.