지난 회에는 웹에 있는 데이터를 가져오는 방법을 알아봤습니다. 이번 회에는 가져온 데이터를 저장하는 몇 가지 방법을 알아보겠습니다. 크게 파일에 저장, DB에 저장, NoSQL DB에 저장하는 3가지가 있습니다.
파일 사용하기
데이터의 구조가 간단하고 양이 많지 않은 경우라면 CSV(Comma Separated Values)로 저장할 수 있습니다. 나중에 필요하면 DB에 넣거나 엑셀에서 불러와 사용하기도 쉽겠죠.
- 파이썬에서 csv를 읽고 쓸 때에는 csv 패키지를 사용합니다.
- 패키지를 가져오고 파일을 열어 csv 패키지의 writer를 만들어 줍니다.
import csv with open('samples.csv', 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_ALL) # 구분자 등 옵션을 지정해줄 수 있습니다.
- with open 이 부분은 파일을 처리할 때 자주 사용하는 패턴입니다. 블록을 마칠 때 파일 닫기를 자동으로 해줍니다.
- 필요에 따라 옵션을 사용해서 구분자를 파이프(|)로 지정하는 등 다양한 CSV 파일의 형식에 대응할 수 있습니다.
- 내용을 쓰려면 writerow 함수를 사용합니다. 튜플, 리스트, 딕셔너리 등 컨테이너형 데이터를 전달할 수 있습니다.
csvwriter.writerow(('Hello', 'World')) # 튜플 csvwriter.writerow(['Spam'] * 5 + ['Baked Beans']) # 리스트(배열)
- CSV 파일 읽기는 csv 패키지의 reader를 사용합니다.
with open('samples.csv', newline='') as csvfile: csvreader = csv.reader(csvfile, delimiter=',', quotechar='"') for row in csvreader: print(', '.join(row))
SQLite 파일 데이터베이스 사용하기
SQLite는 경량 데이터베이스로 모바일, 임베디드, IoT 등 다양한 플랫폼에서 사용되고 있습니다. SQL을 사용하여 데이터를 관리할 수 있고, 파일 형태로 DB 전체가 관리되므로 다른 곳으로 전달하기도 쉽습니다. 또한 많은 OS에서 내장 DB로 사용하고 있기 때문에 기본으로 설치된 경우도 많이 있습니다.
- SQLite 패키지를 가져오고 DB에 연결을 해줍니다.
- 테이블 만들기 : 일반적은 SQL CREATE TABLE 명령으로 만들 수 있습니다.
- 테이블에 INSERT 하기 : 일반적인 SQL INSERT를 사용할 수 있습니다.
- 테이블에서 SELECT 하기
- 나머지 UPDATE, DELETE 등도 SQL로 할 수 있습니다.
MySQL RDB 사용하기
오픈소스로 널리 사용되고 있는 MySQL DB서버를 사용해 공유 가능한 DB를 사용할 수 있습니다. 몇 가지 패키지의 설치가 필요합니다.
- 패키지 설치하기
- MySQL 커넥터 패키지를 설치합니다. conda 명령어를 사용합니다.
> conda install mysql-connector-python - 필요한 경우 ORM 라이브러리인 sqlalchemy도 설치합니다.
> conda install sqlalchemy
- 사용하기
- 필요한 패키지를 가져옵니다.
import mysql.connector from sqlalchemy import create_engine
- 연결을 구성합니다. 연결이 잘 안될 경우 DB 서버의 방화벽/MySQL 접속 제어를 확인해 봅니다.
db_host = 'xxx.xxx.xxx.xxx' db_name = 'sample_db' db_id = 'root' db_pw = 'password' cnx_str = 'mysql+mysqlconnector://'+db_id+':'+db_pw+'@'+db_host+'/'+db_name+'' engine = create_engine(cnx_str, echo=False)
- 테이블에서 SELECT 하기
with eng.connect() as con: rs = con.execute('SELECT * FROM EMP') data = rs.fetchone()[0] print "Data: %s" % data
- 일반적인 RDB 이므로 INSERT, UPDATE, DELETE 및 CREATE 등 모든 기능을 사용할 수 있습니다.
MongoDB NoSQL 사용하기
MongoDB는 대표적인 NoSQL DB로 문서 지향 데이터베이스 입니다. JSON(JavaScript Object Notation) 형식의 문서를 저장하고 검색할 수 있습니다. JSON은 현재 각종 웹 애플리케이션의 데이터 교환에 사용되는 형식으로서 MongoDB를 사용해 기존 RDB의 부작용을 줄이며 웹 스크래핑에 활용할 수 있습니다. 개인적으로 웹 스크래핑의 데이터 중 로그 성격, 조회용이 아닌 저장용 데이터의 경우 사용하기 좋다고 생각합니다.
- 필요한 패키지를 가져옵니다. 보통 pymongo 패키지를 사용합니다.
> import pymongo - 연결을 구성합니다.
> client = MongoClient(‘mongodb://localhost:27017/’) - 사용할 데이터베이스를 선택합니다.
> db = client.stocks # stocks 데이터베이스 선택 - 사용할 컬렉션(RDB의 테이블과 유사)
> coll = db.mystocks - 저장합니다. 가져온 데이터가 JSON이라면 바로 넣을 수 있습니다. JSON 형태가 아니라면 변환해 줍니다.
> coll.insert_one({“Ticker”: “AAPL”, “Company”:”Apple Inc.”}) - 한 건을 조회합니다.
> appl = coll.find_one({“Ticker”:”AAPL”}) - 여러 건을 조회합니다.
for x in coll.find(): print(x)
정리
- 이번에는 가져온 데이터를 저장하는 방법을 알아봤습니다.
- 데이터의 규모에 따라 파일에 저장하거나 규모가 크고 복잡 데이터라면 모델링을 통해 정규화 하여 RDB에 저장할 수 있습니다. 데이터 형식과 용도에 따라 NoSQL을 사용할 수도 있습니다.
- 다음번에는 저장한 데이터를 시각화하고 분석하는 방법을 알아보겠습니다.