1 개요
데이터프레임을 사용했다면 그냥 여기에서 멈추는 것이 아니라, 다른 형태로 저장해두어야 추후에 불러와 사용할 수 있다.
표형 데이터는 판다스로 쉽게 가져올 수 있다.
page = requests.get(url)
tables = pd.read_html(page.text)
2 엑셀
2차원 데이터를 다루는 가장 쉬운 방법은 엑셀을 이용하는 것. 저장하고 시각화 하는 데 엑셀을 이용한다면 굉장히 편리할 것이다.
엑셀 관련기능을 사용하려면 관련 라이브러리를 설치해야 한다.
과정 | 설명 | 방법 |
---|---|---|
파일 저장하기 | openpyxl 따위의 라이브러리 설치가 선행되어야 한다. 따위의 라이브러리 설치가 선행되어야 한다.(pip install openpyxl)
아래 두 방법으로 df를 엑셀에 저장한다. 객체.to_excel('c:\\경로.xlsx') 객체.to_csv('c:\\경로.csv') |
import os # 저장경로를 지정하기 위함.
wd = os.getcwd() # 현재 디랙터리.
file_dir = '{}\\경로명\\'.format(wd) # 저장할 경로 지정.
file_name = '파일이름' # 저장할 이름 지정.
df.to_excel(file_dir + file_name) # 파일저장.
|
파일 불러오기 | openpyxl 따위의 라이브러리 설치가 선행되어야 한다. 따위의 라이브러리 설치가 선행되어야 한다.(pip install openpyxl)
아래 두 방법으로 불러온다. 객체 = pandas.read_excel('c:\\경로.xlsx') 객체 = pandas.read_csv('c:\\경로.csv') |
저장했던 엑셀파일을 불러오면 저장한 df 그대로 사용되는 게 아니라, 엑셀의 제한된 기능에 따라 변형되기 때문에 칼럼을 다시 만져주어야 제대로 사용할 수 있다. 기본적으로 맨 윗줄을 칼럼 처리한다.(상관없으면 그냥 쓰고;)
때문에 df['열이름'] = pd.to_numeric(df['열이름']) 형태로 데이터형을 다시 통일, 설정해주어야 한다.
Sheet_name='시트명' 옵션으로 해당 시트를 열 수도 있다. |
3 mysql
mariasql도 동일하다.
3.1 sqlalchemy 사용
이 방법은 굉장히 간단하다. 다만, 프라이머리키가 중복된 데이터가 있는 경우엔 적용할 수가 없다.(이런 경우엔 겹치는 데이터를 제거해준 후 넣어야 한다.)
과정 | 설명 | 방법 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
라이브러리 설치 | pip install sqlalchemy | |||||||||||||||
모듈 임포트 | from sqlalchemy import create_engine | |||||||||||||||
엔진 연결 | DB를 만든 후에 DB와 연결할 수 있다. | engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
.format(user="root", # sql 계정 입력.
domain='localhost', # 도메인 주소
pw="0000", # sql 비밀번호 입력.
db="dbname")) # 연결할 db이름 입력.
| ||||||||||||||
sql로 전환 | 이미 만들어진 테이블에 dataframe을 넣는다.
(역시, 테이블은 미리 준비되어야 한다.) 옵션은 아래에서 설명한다. |
df.to_sql('테이블명', con = engine, if_exists = 'append', chunksize = 1000)
| ||||||||||||||
옵션값 |
|
3.1.1 관련에러
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user '.....'@'localhost' (using password: YES)")
위 형태의 에러는... 99% 확률로 DB에 대한 정보를 잘못 입력했기 때문에 나오는 에러이다.
3.2 단순 입력
중복된 데이터는 그냥 건너뛰고 새로운 값을 넣어주고 싶을 때 사용하는 방법이다.
과정 | 설명 | 방법 |
---|---|---|
라이브러리 설치 | pip install pymysql | |
모듈 임포트 | import pymysql | |
DB연결 | DB = pymysql.connect(host='localhost', port=3306, db='db이름', user="root", passwd='비밀번호', charset='utf8') | |
커서생성 | sql을 순회하는 커서 생성 | cur = self.coinDB.cursor() |
함수제작 | 함수로 만들어 처리하면 편할 듯하다.
DB 객체와 테이블명을 넣어 작동한다. |
def df_to_db(df, db, table):
'''df를 받아 db에 저장하는 것.'''
cur = db.cursor() # 커서를 만든다.
cols = "`,`".join([str(i) for i in df.columns.tolist()]) # df의 칼럼을 추출한다.
for i, row in df.iterrows(): # 하나씩 입력한다.
try:
sql = "INSERT INTO `{table}` (`{cols}`) VALUES (".format(table=table, cols=cols) + "%s," * (
len(row) - 1) + "%s)" # 마지막엔 쉼표 없이.
cur.execute(sql, tuple(row))
# the connection is not autocommitted by default, so we must commit to save our changes
db.commit()
except Exception as e:
# print(e)
pass
|