데이터 카드를 패키지 형태로 압축 및 해제하는 기능을 제공하는 코드를 작성할 수 있습니다. 여기서는 zipfile 모듈을 사용하여 데이터를 .zip 파일로 압축하고, 필요 시 이를 해제하는 방식으로 구현합니다.
데이터카드 패키지 압축 및 해제 코드
import os
import json
import zipfile
from datetime import datetime
class DataCard:
"""데이터 카드 클래스"""
def __init__(self, name, data, metadata=None):
self.name = name
self.data = data
self.metadata = metadata or {
"created_at": datetime.now().isoformat(),
"description": "Default data card metadata."
}
def to_dict(self):
"""데이터카드를 딕셔너리로 변환"""
return {
"name": self.name,
"data": self.data,
"metadata": self.metadata,
}
@staticmethod
def from_dict(data_dict):
"""딕셔너리로부터 데이터카드 생성"""
return DataCard(
name=data_dict["name"],
data=data_dict["data"],
metadata=data_dict["metadata"]
)
class DataCardPackage:
"""데이터 카드 패키지 압축 및 해제 클래스"""
@staticmethod
def compress(data_cards, output_path):
"""데이터 카드를 ZIP 패키지로 압축"""
with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for index, card in enumerate(data_cards):
card_name = f"card_{index + 1}.json"
card_content = json.dumps(card.to_dict(), indent=4)
zipf.writestr(card_name, card_content)
print(f"Data cards compressed into: {output_path}")
@staticmethod
def decompress(zip_path, extract_path):
"""ZIP 패키지를 해제하여 데이터카드 목록 반환"""
data_cards = []
with zipfile.ZipFile(zip_path, 'r') as zipf:
zipf.extractall(extract_path)
for file_name in zipf.namelist():
file_path = os.path.join(extract_path, file_name)
with open(file_path, 'r') as file:
card_dict = json.load(file)
data_cards.append(DataCard.from_dict(card_dict))
print(f"Data cards extracted to: {extract_path}")
return data_cards
# 사용 예제
if __name__ == "__main__":
# 데이터 카드 생성
card1 = DataCard(name="Card1", data={"key1": "value1", "key2": "value2"})
card2 = DataCard(name="Card2", data={"keyA": "valueA", "keyB": "valueB"})
# 데이터 카드 압축
cards = [card1, card2]
output_zip = "data_cards.zip"
DataCardPackage.compress(cards, output_zip)
# 압축 해제
extract_dir = "extracted_cards"
os.makedirs(extract_dir, exist_ok=True)
extracted_cards = DataCardPackage.decompress(output_zip, extract_dir)
# 해제된 데이터카드 출력
for card in extracted_cards:
print(f"Name: {card.name}, Data: {card.data}, Metadata: {card.metadata}")
코드 설명
- DataCard 클래스:
- 데이터를 표현하는 기본 데이터카드 객체.
- 데이터카드를 딕셔너리로 변환하는 to_dict 메서드와, 딕셔너리로부터 데이터카드를 생성하는 from_dict 메서드 제공.
- DataCardPackage 클래스:
- 데이터카드 압축(compress) 및 해제(decompress) 기능을 포함.
- 압축 시 데이터카드를 JSON 파일 형태로 변환하여 .zip 파일로 저장.
- 해제 시 .zip 파일에서 JSON 파일을 읽고, 이를 DataCard 객체로 변환.
- 사용 예제:
- 두 개의 데이터카드를 생성하고 이를 data_cards.zip 파일로 압축.
- 압축된 파일을 해제하여 원래의 데이터카드를 복원.
실행 결과 (예시):
압축 완료 메시지:
Data cards compressed into: data_cards.zip
해제 완료 메시지:
Data cards extracted to: extracted_cards
복원된 데이터카드 출력:
Name: Card1, Data: {'key1': 'value1', 'key2': 'value2'}, Metadata: {'created_at': '2025-01-07T12:00:00.123456', 'description': 'Default data card metadata.'}
Name: Card2, Data: {'keyA': 'valueA', 'keyB': 'valueB'}, Metadata: {'created_at': '2025-01-07T12:00:00.123456', 'description': 'Default data card metadata.'}
주요 기능
- 데이터카드 압축:
- 여러 데이터카드를 .zip 파일로 묶어 관리.
- JSON 형식으로 저장하여 직관적인 데이터 구조 유지.
- 데이터카드 해제:
- .zip 파일에서 데이터를 복원하고, 데이터카드 객체로 재생성.
- 유연한 메타데이터 관리:
- 각 데이터카드는 생성 시간 등 메타데이터를 포함.
이 코드는 데이터카드를 저장하고 전송하거나, 대규모 데이터 관리에 활용할 수 있는 실용적인 방법을 제공합니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] 통계 정보를 포함하는 메타클래스 (0) | 2025.01.07 |
---|---|
[실용적인 코드 샘플] 메타데이터용 메타클래스 사용 샘플코드 (0) | 2025.01.07 |
[실용적인 코드 샘플] `object` 클래스를 상속 사용자 정의 데이터 타입 (1) | 2024.10.23 |
[실용적인 코드 샘플] 히스토리 기반 통계 작성 클래스 (8) | 2024.10.22 |
[실용적인 코드 샘플] Way Point기반 시나리오 맵 자료구조 (10) | 2024.10.22 |