[파이썬3.0] 피클링

프로그램 언어/파이썬|2014. 6. 15. 13:40

피클링

표준 라이브러리

모든 파이썬 데이터 객체를 저장하고 읽을 수 있다.

데이터를 파일에 피클링하면, 데이터는 영구적으로 존재하게 되고, 나중에 다른 프로그램이 읽을 수도 있다.

 

 

피클링 과정

 

피클링된 데이터를 디스크에 저장 가능.

데이터베이스에도 가능

네트워크를 통해 다른 컴퓨터에 전송 가능.

 

위 피클링 과정을 반대로 수행하면, 데이터를 꺼내서 파이썬 메모리에 있던 원래의 형태로 다시 만들게 된다.

언피클링(데이터를 메모리로 올리는 방식)

  피클링하는 방법

피클 사용방법.

  1. 필요한 모듈을 임포트
  2. Dump()를 사용해서 데이터를 저장.
  3. Load()로 다시 읽어 오면 끝.

※피클 파일로 작업할 때는 파일을 이진 접근 모드로 열어야 한다.

데이터를 저장하거나 읽을 때 문제가 생긴다면?

Pickle모듈이 PickleError 형의 예외를 발생시킨다

 

피클링 하는 소스코드

import pickle

 

man = []

other = []

 

try:

data = open('sketch.txt')

 

for each_line in data:

try:

(role, line_spoken) = each_line.split(':')

line_spoken = line_spoken.strip()

if role == 'Man':

man.append(line_spoken)

elif role == 'Other Man':

other.append(line_spoken)

else:

pass

except ValueError:

pass

 

data.close()

except IOError:

print('The datafile is missing!')

 

try:#w(write)로 열었던 파일을 wb로 여는데 여기서b는 이진수를 의미한다.

with open('man.txt', 'wb') as man_file, open('other.txt', 'wb') as other_file:

pickle.dump(man, file=man_file)#피클링된 데이터로 저장하기 위해서 dump()를 사용.

pickle.dump(other, file=other_file)

except IOError as err:

print('File error: ' + str(err))

except pickle.PickleError as perr:

print('Pickling error: ' + str(perr)).

 

이렇게 피클링한 파일을 열어 보면(man.txt) 알아 볼 수 없는 형태로 저장되어 있다.

왜냐하면 피클링 모듈은 바이너리(이진수)로 변형되어 저장이 되기 때문이다.

하지만 피클링한 데이터를 읽어서 메모리로 올리는 작업을 하고 나면, 사용자들은 피클링하기 전의 상태의 값들을 사용할 수 있게 된다.

 

피클링->메모리(언피클링/본인이 맘대로 붙인 말)

>>> import pickle

>>> import nest

>>> new_man=[]

>>> try:

    with open('man.txt', 'rb') as man_file:

        new_man = pickle.load(man_file)

except IOError as err:

    print('File error: ' + str(err))

except pickle.PickleError as perr:

    print('Pickling error: ' + str(perr))

 

    

>>> nest.print_lol(new_man)#우리가 알아볼 수 있는 형태로 출력이 된다.!!

Is this the right room for an argument?

No you haven't!

When?

No you didn't!

You didn't!

You did not!

Ah! (taking out his wallet and paying) Just the five minutes.

You most certainly did not!

Oh no you didn't!

Oh no you didn't!

Oh look, this isn't an argument!

No it isn't!

It's just contradiction!

It IS!

You just contradicted me!

You DID!

You did just then!

(exasperated) Oh, this is futile!!

Yes it is!

>>> print(new_man[0])#메모리로 올려놨기에 일반적인 객체를 사용하듯 할 수 있다.

Is this the right room for an argument?

>>> print(new_man[-1])

Yes it is!

>>>

댓글()