다양한 형태의 데이터 저장 방법을 살펴보고자 한다.
데이터 저장을 위한 폴더가 이미 존재하는지 확인하고, 없다면 새로 생성
import os
# 폴더 'log'가 없으면 생성
if not os.path.isdir('log'):
os.mkdir('log')
movie.to_csv('movie.csv', index=False, encoding='utf-8-sig')
movie.to_excel('movie.xlsx', index=False)
index=False
는 데이터를 저장할 때 인덱스를 제외하도록 설정하는 부분이다. data에 한글이 있을 경우 csv파일로 저장시 글자가 깨져있는 경우가 있다. 이를 방지하기 위해 csv 파일 저장시 encoding 설정을 해준다.
import pandas as pd
writer = pd.ExcelWriter('certifications.xlsx', engine='openpyxl')
certi.to_excel(writer, sheet_name='Certification')
certi_tags.to_excel(writer, sheet_name='Certification Tags')
writer.save()
with open("data/OCR/v2/google_card_ids_3.txt", 'w') as f:
for i in range(len(df1)):
data = df1.iloc[i, 0] + '\n' # 각 데이터 항목을 줄바꿈 문자와 함께 저장
f.write(data)
데이터를 바이너리 형태로 직렬화하여 저장하고, 필요할 때 다시 불러올 수 있도록 한다.
직렬화(Serialization)란 데이터 구조나 객체 상태를 저장, 전송 가능한 형태로 변환하는 과정을 말한다. 다시 말해, 메모리에 상주하는 객체를 파일, 데이터베이스, 네트워크를 통한 전송 등에 적합한 포맷(예: 바이트 스트림)으로 변환하는 것이다. 이 과정을 통해 복잡한 객체들도 쉽게 저장하고 나중에 그 상태를 복원(역직렬화)할 수 있게 된다.
import pickle
x=[1,2,3,4,5]
# 저장하기
with open('test.pkl', 'wb') as f:
pickle.dump(x, f)
# 불러오기
with open('test.pkl', 'rb') as f:
p = pickle.load(f)
import joblib
# 여러 데이터 저장하기
with open('data/joblib.pkl', 'wb') as f:
joblib.dump({'data1': df1, 'data2': df2}, f)
# 데이터 불러오기 및 로컬 변수에 할당
with open('data/joblib.pkl', 'rb') as f:
data = joblib.load(f)
locals().update(data) # 변수 data1, data2 생성
locals().update(data)
는 dictionary를 받아서 key에 값을 변수로 주는 기능을 한다. 즉, 변수 data1를 실행하면 저장했던 df1이 출력된다.
import dill
# 객체 직렬화하기
with open('my_object.pkl', 'wb') as f:
dill.dump(my_object, f)
# 객체 역직렬화하기
with open('my_object.pkl', 'rb') as f:
my_object_loaded = dill.load(f)
dill도 마찬가지로 pickle 기능을 확장하여 더 복잡한 python 객체들을 직렬화 할 수 있다. 특히 함수, 클로저, 람다, 클래스 등의 객체들을 포함한다. dill은 복잡한 객체 유형의 직렬화에 강점을 가지고 있는 반면, joblib은 대규모 숫자 데이터(특히 머신러닝 모델과 배열)의 효율적인 직렬화와 관리에 초점을 맞추고 있다.