지속성(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
Posted by scii
:


표준 출력

표준 출력을 파일로 저장

print에 의해 출력되는 내용을 파일로 저장하는 방법이 있다. sys모듈의 stdout은 출력을, stderr은 표준 에러 출력을, stdin은 입력을 위한 객체를 지정하고 있다. 

sys.stdout을 파일 객체로 변환하면 모든 print 문(표준 출력)에 의한 출력이 파일로 저장된다.




표준 에러 (stderr)

print 문을 직접 이용하기

print 문의 출력을 파일로 직접 보낼 수 있다. 표준 에러로 출력을 보내려면, 다음과 같이 하면된다.


이것은 sys.stderr(표준 에러)로 리다이렉션하고 옆의 문장을 내보내라가 된다. 즉, 표준에러로 문장을 내보내라



표준 출력을 문자열로 저장

print 출력을 문자열로 저장하는 방법은 StringIO 표준 모듈을 이용하는 것이 간편하다.

StringIO 모듈의 StringIO 클래스는 문자열을 파일 객체처럼 입/출력한다.




문자열을 파일 객체처럼 읽기

주어진 문자열이 있고, 그것을 파일 객체를 이용해서 파일처럼 읽어 내야 할 필요가 있을 때 StringIO 모듈을 이용한다.



실행 결과



'Programming > Python' 카테고리의 다른 글

함수의 중첩 영역  (0) 2013.04.27
[File I/O] 지속 모듈  (0) 2013.04.14
파일 입/출력 예제  (0) 2013.03.12
파일 객체 속성들  (0) 2013.03.11
객체의 복사 및 형 변환  (0) 2013.03.08
Posted by scii
:


rep.py


정규식도 가능하다.


18라인의 __name__은 모듈 내의 내장 변수로 현재 모듈의 이름을 나타낸다. 직접 지정하지 않아도 파이썬이 이러한 이름들을 기본적으로 제공한다. 최상위에서 수행되는 모듈은 이터프리터의 이름인 '__main__' 을 가진다. 

이것은 곧 모듈이 최상위에서 수행되고 있다는 것을 의미한다. rep.py가 다른 모듈에 포함되어 수행되면 이 모듈의 __name__은 'rep' 라는 모듈 이름을 가진다. 

요약하면, python rep.py와 같이 수행하면 18번 이하의 문들이 수행되지만, 만일 다른 파일에서 import rep 와 같이 사용된다면(즉, 최상위 모듈이 아니라면) 18번 이하의 문들은 수행되지 않는다.

따라서, 모든 파일은 자체 수행되는 메인 코드를 가질 수도 있으며, 다른 모듈에 의해 호출되어 필요한 함수만을 제공할 수도 있다. 


실행 결과


'Programming > Python' 카테고리의 다른 글

[File I/O] 지속 모듈  (0) 2013.04.14
표준 입/출력 방향 전환  (0) 2013.04.13
파일 객체 속성들  (0) 2013.03.11
객체의 복사 및 형 변환  (0) 2013.03.08
집합 자료형  (0) 2013.03.07
Posted by scii
:


기본 파일 메소드

 Method

설명 

 file.close() 

 파일을 닫는다. 더 이상 입출력할 수 없게 된다. 

 file.read([size]) 

 원하는 바이트 수만큼 파딜에서 읽어 온다. 인수를 지정하지 않으면 전체 파일을 읽어 온다. 

 file.readline() 

 라인 하나를 읽어 들인다. size가 지정되면 읽을 수 있는 최대 바이트 수가 된다. 

 file.readlines() 

 전체 라인을 readline()을 이요하여 읽어 들인 라인을 리스트에 넣어서 리턴한다. 

 file.write(str) 

 문자열 str을 파일에 쓴다. 

 file.writelines(list) 

 문자열 리스트를 파일에 쓴다. 줄 바꾸기가 자동으로 삽입되지는 않는다. 

 file.seek(offset[, whence]) 

 whence의 기본 값은 0이다. 0이면 시작 기준, 1이면 현재 위치 기준, 2면 끝 기준에서 offset만큼 떨어진 위치에 파일 포인터를 위치시킨다. 

 file.tell() 

 파일의 현재 위치를 리턴한다. 



기타 파일 메소드

 Method

설명 

 file.flush() 

 버퍼가 다 채워지지 않았어도 내부 버퍼의 내용을 파일에 보낸다. 

 file.fileno() 

 file 객체의 파일 기술자(File Descriptor)(정수)를 리턴한다. 

 file.isatty() 

 만일 file 객체가 tty와 같은 같은 장치이면 1 아니면 0을 리턴한다. 

 file.truncate([size]) 

 파일 크기를 지정된 크기로 잘라 버림. 인수를 주지 않으면 현재 위치에서 자른다. 



파일 객체 속성

Method 

설명 

 file.closed 

 file이 close 되었으면 1 아니면 0 

 file.mode 

 파일이 오픈된 모드 

 fjle.name 

 open()할 때 사용된 파일 이름 

 file.softspace 

 1이면 print문을 사용할 때 값 출력 사이에 자동적으로 스페이스가 출력됨. 0이면 스페이스가 자동으로 삽입되지 않음.



임의 접근 파일

파일의 임의의 위치의 내용을 접근하는 임의 접근 모드가 필요할 경우가 종종있다. 이때 필요한 메쏘드들은 다음과 같은 것들이 있다.

seek(n) - 파일의 n번째 바이트로 이동

seek(n, 1) - 현재 위치에서 n바이트 이동(n이 양수이면 뒤쪽으로, 음수이면 앞쪽으로 이동)

seek(n, 2) - 맨 마지막에서 n바이트 이동(n은 보통 음수)

tell() - 현재의 파일 포인터 위치를 돌려줌


'Programming > Python' 카테고리의 다른 글

표준 입/출력 방향 전환  (0) 2013.04.13
파일 입/출력 예제  (0) 2013.03.12
객체의 복사 및 형 변환  (0) 2013.03.08
집합 자료형  (0) 2013.03.07
사전 자료형을 이용한 전화번호부 프로그램  (0) 2013.03.06
Posted by scii
:

파이썬에서 복사는 두 가지 의미가 있다. 하나는 레퍼런스 복사, 또 하나는 실제 객체의 복사이다.


레퍼런스 복사란 객체는 그대로 두고 객체를 참조하는 주소만 복사하는 것이다.

객체 복사란 같은 값을 가지는 객체를 하나 혹은 그 이상 만드는 것이다. 대표적인 예가 슬라이싱이다. (슬라이싱을 이용하면, 완전히 다른 별개의 객체가 된다.)


copy 모듈을 이용한 객체 복사

copy 모듈은 얕은 복사(Shallow copy)를 하는 copy 연산과 깊은 복사(Deep copy)를 하는 deepcopy 연산을 제공한다.

얕은 복사: 복합 객체를 별도로 생성하되 내용은 원래의 레퍼런스로 채운다.

깊은 복사: 복합 객체를 생성하고 내용을 재귀적(Recursive)으로 복사한다.


※ 깊은 복사를 할 때는 객체들이 재귀적인 구조를 가지고 있지 않은가 주의해야 한다. 또한 깊은 복사는 모든 것을 복사해 버리므로 공유되어야 할 자료가 포함되어 있지 않은가 주의해야 한다.



물자열로의 형 변환

객체를 문자열로 변환하려면 다음의 세 가지 방법을 사용할 수 있다.

str() - 문자열로 변환

repr() - 문자열로 변환

`obj` - repr(obj)와 같음


str은 비형식적인 문자열 변환이다. 즉, 보기 좋게 출력될 문자열을 생성한다고 생각하면 된다.

repr은 좀 더 형식적인 문자열 변환이다. 객체의 자료형을 정확하게 문자열로 표현하며, eval로 역표현이 가능하다.




임의의 진수로 변환



10진수에서 2진수로

binary.py


10진수를 2진수로

binary2.py



정수를 콤마가 있는 문자열로 변환

locale 모듈은 나라마다 문화적으로 표현이 다른 것들을 처리할 수 있게 도와준다.


'Programming > Python' 카테고리의 다른 글

파일 입/출력 예제  (0) 2013.03.12
파일 객체 속성들  (0) 2013.03.11
집합 자료형  (0) 2013.03.07
사전 자료형을 이용한 전화번호부 프로그램  (0) 2013.03.06
사전 (Dictionary)  (0) 2013.03.06
Posted by scii
:

집합 자료형

Programming/Python 2013. 3. 7. 00:28 |


set과 frozenset 이라는 집합 내장 자료형이 새롭게 도입되었다. 집합 연산에 필요한 다양한 연산을 수행할 수 있다. set과 frozenset 자료형은 변경 불가능한 값들을 저장하는 순서가 없는 집합적 자료형이다. 

set 자료형은  변경 가능 자료형

frozenset 자료형은 변경 불가능 자료형. 즉, frozenset 은 자신을 변경시키는 연산을 수행할 수 없다.


set 과 frozenset 공통적으로 적용될 수 있는 연산들

 연산

동등한 표현 

내 용 

len(s) 

 

원소의 수 

x in s 

 

멤버쉽 테스트 

x not in s 

 

멤버쉽 테스트 

s.issubset(t) 

s <= t 

s가 t의 부분 집합인가 

s.superset(t) 

s >= t 

포함 집합인가 

s.union(t) 

s | t 

새로운 s와 t의 합집합 

s.intersection(t) 

s & t 

교집합 

s.difference(t) 

s - t 

차집합 

s.symmetric_difference(t) 

s ^ t 

배타집합 

s.copy() 

 

집합 s를 얕은 복사 



set 자료형에만 적용 가능한 연산들

 연 산

동등한 표현 

내 용 

 s.update(t)

s |= t 

 s와 t의 합집합을 s에 저장

s.intersection_update(t) 

s &= t 

 s와 t의 교집합을 s에 저장

s.difference_update(t) 

s -= t 

 s와 t의 차집합을 s에 저장

s.symmetric_difference_update(t)

s ^= t 

 s와 t의 배타집합을 s에 저장

s.add(x) 

 

 원소 x를 s에 추가

s.remove(x) 

 

 원소 x를 s에서 제거. 없으면 keyError 예외 발생

s.discard(x) 

 

 원소 x가 있다면 s에서 제거

s.pop() 

 

 s에서 임의의 원소를 하나 리턴하고 집합에서는 제거. 빈 집합이면 예외 발생

s.clear() 

 

 집합 s의 모든 원소 제거



Posted by scii
:

전화번호부 프로그램

aa.py



C언어로 구현하면 엄청은 아니지만 좀 많이 길어질 것이 소스코드들이 Python으로 구현하니 엄청나게 짧아졌다. 그리고 직관적이다.





함수 레퍼런스를 사전에 저장해 두었다가 함수를 호출하여 적절한 값을 얻는 프로그램

dict_func.py



실행 결과


'Programming > Python' 카테고리의 다른 글

객체의 복사 및 형 변환  (0) 2013.03.08
집합 자료형  (0) 2013.03.07
사전 (Dictionary)  (0) 2013.03.06
Python 스크립트를 실행파일(exe) 로 만들기  (0) 2013.02.25
아으.. 삽질한 가변인자 코드  (0) 2013.02.25
Posted by scii
:

사전은 임의의 객체의 집합적 자료형인데, 자료의 순서를 가지지 않는다. 집합적이라는 의에서 리스트나 튜플과 동일하나, 자료의 순서를 정할 수 없는 매핑(Mapping)형이다. 시퀀스 자료형은 자료의 순서를 정할 수 있어서 정수 옵셋에 의한 인덱싱이 가능했지만, 매핑 형에서는 키(Key)를 이용해 값(Value)에 접근한다. 

사전을 출력하면 어떤 순서에 의해서 입력 값들이 표현된다. 그런, 이런 순서는 고정 된 것이 아니라, 입력 값의 종류의 따라서 이러한 순서는 언제든지 바뀔 수 있다. 왜 이런 구조를 사용하느냐 하면, 키에 의한 검색 속도를 빨리하기 위해서이다. 

참고적으로 전문적인 용어로 설명하면 사전은 내부적으로 해쉬(Hash) 라는 기법을 이용하여 자료를 저장한다. 이 해쉬 기법은 자료의 크기가 증가해도 빠른 속도로 자료를 찾을 수 있게 해준다.


※ 사전을 해보니까 C언어에서의 enum 자료형이 생각이 든다. 


값은 임의의 객체가 될 수 있지만, 키는 변경 불가능(Immutable) 자료형이어야 한다. 예를 들어 문자열, 숫자, 튜플,은 키가 될 수 있지만 리스트, 사전은 키가 될 수 없다.




사전 객체의 메쏘드

사전 구조는 시퀀스 형인 리스트나 튜플과는 다르나, 반복적인 혹은 순차적인 처리르 위하여 때로는 이들 자료형으로 변환해야 할 필요가 있다. 이런 경우 사용되는 사전 D에 대한 주요 메쏘드는 다음과 같다.

D.keys()         사전에서 키들을 리스트로 리턴

D.values()         값들을 리스트로 리턴

D.items()         (key, value) 리스트 리턴

key in D         멤버쉽 테스트, D가 key를 가지고 있으면 True



그 외의 메쏘드

D.clear()         사전 D의 모든 아이템 삭제

D.copy()         사전 복사(shallow copy)

D.get(key [, x])         값이 존재하면 D[key], 아니면 x 리턴

D.setdefault(key [, x])         get과 같으나 값이 존재하지 않을 때, 값을 설정(D[key] = x)

D.update(b)         for k in b.keys(): D[k] = b[k]

D.popitem()         (키, 값) 튜플을 리턴하고 사전에서 항목을 제거한다.

D.pop(key)         key 항목의 값을 리턴하고 사전에서 제거한다.




객체의 심볼 테이블

이름 공간(심볼들이 저장되는 공간)을 가지는 모든 객체는 심볼 테이블을 가진다. 어떤 객체의 심볼 테이블을 얻으려면 __dict__ 속성을 이용한다. 

globals()를 사용하면 전역 영역(모듈 영역)의 심볼 테이블(사전)을 얻는다.

locals()를 사용하면 지역 영역의 심볼 테이블을 얻는다.




사전을 for 문으로 참조하기


Posted by scii
: