3. 데이터 저장하기

wandajeong·2024년 4월 15일
0

Data Handling

목록 보기
4/15

다양한 형태의 데이터 저장 방법을 살펴보고자 한다.

폴더 생성

데이터 저장을 위한 폴더가 이미 존재하는지 확인하고, 없다면 새로 생성

import os

# 폴더 'log'가 없으면 생성
if not os.path.isdir('log'):
    os.mkdir('log')

데이터 파일로 저장

  • Excel, csv
movie.to_csv('movie.csv', index=False, encoding='utf-8-sig')
movie.to_excel('movie.xlsx', index=False)

index=False는 데이터를 저장할 때 인덱스를 제외하도록 설정하는 부분이다. data에 한글이 있을 경우 csv파일로 저장시 글자가 깨져있는 경우가 있다. 이를 방지하기 위해 csv 파일 저장시 encoding 설정을 해준다.

  • 여러 DataFrame을 하나의 Excel파일로 저장
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)란 데이터 구조나 객체 상태를 저장, 전송 가능한 형태로 변환하는 과정을 말한다. 다시 말해, 메모리에 상주하는 객체를 파일, 데이터베이스, 네트워크를 통한 전송 등에 적합한 포맷(예: 바이트 스트림)으로 변환하는 것이다. 이 과정을 통해 복잡한 객체들도 쉽게 저장하고 나중에 그 상태를 복원(역직렬화)할 수 있게 된다.

  • pickle
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)
  • joblib
    joblib은 pickle보다 더 복잡한 데이터 구조를 효율적으로 처리할 수 있다. 예를 들어, pickle은 하나의 파일만 저장하지만 joblib은 여러 개의 파일을 하나로 저장할 수 있다.
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이 출력된다.

  • dill
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은 대규모 숫자 데이터(특히 머신러닝 모델과 배열)의 효율적인 직렬화와 관리에 초점을 맞추고 있다.

profile
ML/DL swimmer

0개의 댓글