[File I/O] 지속 모듈
Programming/Python 2013. 4. 14. 00:17 |
지속성(Persistence) 이란 어떤 프로그램이 만든 데이터가 프로그램이 종료되고 나서도 존재하게 하고, 또 그 후에 다시 그 데이터를 프로그램에서 사용하는것이다.
리스트, 튜플, 사전 등 읨의의 객체를 파일에 쓰고, 읽으려면 어떻게 해야 할까? 또 내가 만든 클래스나 인스턴스를 그대로 파일에 쓰려면 어떻게 해야 할까?
이러한 작업은 단순한 파일 입/출력 기법으로는 구현하기 어렵다. 파이썬은 파이썬 객체를 파일에 저장하는 몇 가지의 기법을 제공하고 있다.
DBM 관련 모듈
데이터를 DBM 형식으로 파일에 기록한다.
시스템에 따라서 관련된 다양한 모듈들이 제공된다. (anydbm, dbm, gdbm, dbhash, dumbdbm)
anydbm 모듈을 사용하면 시스템에서 사용가능한 모듈 중 DBM 호환 가능한 최적의 모듈을 찾아준다. 기능이 가장 떨어지긴하지만 dumbdbm이 기본적으로 제공된다.
사전 자료형을 쓰는 법과 동일한 인터페이스를 제공한다.
키와 값은 모두 문자열이어야 한다.
pickle 모듈
파이썬 객체를 피클링하여 파일에 저장하는 일반화된 지속성 모듈이다.
파이썬 기본 객체뿐 아니라 복잡하게 얽혀 있는 객체들의 관계까지도 저장 가능하다.
재귀적인 관계도 모두 처리한다.
사용자 정의 클래스와 인스턴스도 처리한다.
기본적으로 텍스트 모드로 저장되나 이진 모드로도 저장 가능하다.
marchal 모듈
파이썬의 기본 객체(None, 수치 형, 문자열, 튜플, 리스트, 사전 및 코드 객체)를 이진 포멧으로 저장한다.
재귀적인 사전이나 리스트는 처리할 수 없다.
이 모듈은 주로 .PYC 파일의 컴파일된 코드를 쓰고 읽는데 사용된다.
일반 객체 입/출력은 pickle 모듈을 사용해야한다. 사용법은 pickle과 동일하다.
shelve 모듈
사전 자료형으로 자료를 접근할 수 있도록 한 것은 anydbm과 동일하나, 차이점은 임의의 파이썬 객체가 값(value)로 사용될 수 있다.
내부에서 사전형 인터페이스를 위해서 anydbm 모듈을 사용하고 객체 저장을 위해서 cPickle 모듈 (pickle의 C 버전) 을 이용한다.
값으로 임의의 객체가 저장될 수 있다.
DBM 파일 관련 모듈
anydbm 모듈은 시스템에서 사용 가능한 dbm 호환 가능한 최적의 모듈을 찾아준다. 사용법은 사전 자료형과 거의 유사하다.
키에 의한 참조로 파일에서 자료를 읽어 오고, 인덱싱으로 치환하는 것으로 파일에 자료를 저장한다.
키와 값은 반드시 문자열이어야 한다.
사용 예
생성된 DBM 파일을 읽어서 처리하는 예
피클링 (Pickling)
pickle 모듈은 임의의 파이썬 객체를 저장하는 가장 일반화된 모듈이다.
pickle 모듈은 파이썬 기본 객체뿐 아니라 사용자 클래스, 인스턴스 및 복잡하게 얽혀 있는 객체들의 관계까지도 저장한다.
재귀적인 관계도 모두 처리한다.
※ 피클링은 '절임' 이란 뜻이다. 오이나 배추 등을 소금에 절여서 저장해 두는 것을 말한다. 여기서는 객체를 파일에 저장하는 의미이다.
소금이 원래의 상태를 보존하듯이 파이썬 피클링은 객체의 상태를 그대로 저장한다. 피클링을 이용하면 기본 자료형 이외의 복잡한 자료형을 텍스트 형태로 혹은 이진 파일 형태로 변환하여 저장하거나, 네트워크를 통해 다른 시스템으로 전달 가능하며, 다시 원래의 객체 형태로 복원 가능하게 된다.
객체를 파일로 출력하려면 pickle.dump를 이용한다.
pickle.dump(출력할 객체, 파일 객체)
객체를 파일에서 읽어 들이려면 pickle.load를 이용한다.
pickle.load(파일 객체)
문자열로 객체를 출력하거나 문자열에서 객체를 읽어 들이려면 dumps, loads 를 사용한다.
s = pickle.dumps(출력할 객체)
object = pickle.loads(s)
pickle의 좋은 점:
사용자가 정의한 임의의 클래스 및 인스턴스 객체도 저장할 수 있다는 것이다.
저장될 시점의 모든 멤버 변수들의 값이 그대로 유지되므로 언제든지 다시 불러서 계속적인 수행이 가능하다. 예를 들어, 일정한 분량의 작업을 수행하다가 멈추고 현재 상태를 pickle을 이용하여 저장한 후 나중에 다시 읽어 들여 계속적으로 수행하게 할 수 있다.
다음은 사용자 클래스 인스턴스 객체를 저장하고 읽는 예이다.
이것은 디버깅을 쉽게 하고 문제가 생겼을 때 일반 텍스트 에디터로 복구를 쉽게 하기 위한 것이다.
하지만, 이 방식은 파일 크기도 크고 또한 처리 속도도 느리다. 만일 이진 모드로 저장하여 효과적인 처리를 원한다면 dump할 때 이진 모드로 설정하면 된다.
위의 예에서 pickle.dump를 호출할 때 생략된 세 번째 인수 bin에 참 값을 넣어 주면 효과적인 이진 파일로 저장된다.
pickle.dump(s, f, bin=1) # bin 인수에 True가 주어지면 이진 파일로 인스턴스가 저장된다.
cPickle 모듈
만일 pickle 모듈의 속도가 느리다고 생각한다면, C로 만들어진 cPickle 모듈을 사용하면 된다.
cPickle 모듈은 pickle 모듈과 같은 인터페이스를 가지고 있지만 약 1000배 빨리 수행되도록 설계되었다.
'Programming > Python' 카테고리의 다른 글
키워드 인수 (0) | 2013.04.27 |
---|---|
함수의 중첩 영역 (0) | 2013.04.27 |
표준 입/출력 방향 전환 (0) | 2013.04.13 |
파일 입/출력 예제 (0) | 2013.03.12 |
파일 객체 속성들 (0) | 2013.03.11 |