피클 파일에 여러 개체를 저장하고로드 하시겠습니까?
게임에서 플레이어에게 서비스를 제공하고, 플레이어와 다른 것들을 만드는 클래스가 있습니다.
나중에 사용하려면 이러한 플레이어 개체를 파일에 저장해야합니다. pickle 모듈을 사용해 보았지만 여러 개체를 저장하고 다시로드하는 방법을 모르겠습니까? 그렇게하는 방법이 있습니까, 아니면 목록과 같은 다른 클래스를 사용하고 목록에 내 개체를 저장하고로드해야합니까?
더 좋은 방법이 있습니까?
목록, 튜플 또는 사전을 사용하는 것이 가장 일반적인 방법입니다.
import pickle
PIK = "pickle.dat"
data = ["A", "b", "C", "d"]
with open(PIK, "wb") as f:
pickle.dump(data, f)
with open(PIK, "rb") as f:
print pickle.load(f)
다음과 같이 인쇄됩니다.
['A', 'b', 'C', 'd']
그러나 피클 파일 에는 여러 피클 이 포함될 수 있습니다. 다음은 동일한 출력을 생성하는 코드입니다. 그러나 작성하고 이해하는 것이 더 어렵다는 점에 유의하십시오.
with open(PIK, "wb") as f:
pickle.dump(len(data), f)
for value in data:
pickle.dump(value, f)
data2 = []
with open(PIK, "rb") as f:
for _ in range(pickle.load(f)):
data2.append(pickle.load(f))
print data2
이렇게하면 작성하는 파일에 피클이 몇 개 있는지 아는 것은 사용자의 책임입니다. 위의 코드는 먼저 목록 개체의 수를 선택하여이를 수행합니다.
Tim Peters의 대답에 두 가지 추가 사항이 있습니다.
첫째 , 파일의 끝을 쳤을 때로드를 중지하면 별도로 피클 한 항목 수를 저장할 필요가 없습니다.
def loadall(filename):
with open(filename, "rb") as f:
while True:
try:
yield pickle.load(f)
except EOFError:
break
items = loadall(myfilename)
이것은 파일에 피클 만 포함되어 있다고 가정합니다. 거기에 다른 것이 있으면 발전기는 거기에있는 다른 것 역시 피클로 취급하려고하므로 위험 할 수 있습니다.
둘째 , 이렇게하면 목록이 아니라 생성자가 됩니다. 이렇게하면 한 번에 하나의 항목 만 메모리에로드됩니다. 이는 덤프 된 데이터가 매우 큰 경우 유용합니다. 처음에 여러 항목을 개별적으로 피클해야하는 한 가지 가능한 이유입니다. 당신은 여전히 반복 할 수 items
로 for
이 목록 것처럼 루프.
이 시도:
import pickle
file = open('test.pkl','wb')
obj_1 = ['test_1', {'ability', 'mobility'}]
obj_2 = ['test_2', {'ability', 'mobility'}]
obj_3 = ['test_3', {'ability', 'mobility'}]
pickle.dump(obj_1, file)
pickle.dump(obj_2, file)
pickle.dump(obj_3, file)
file.close()
file = open('test.pkl', 'rb')
obj_1 = pickle.load(file)
obj_2 = pickle.load(file)
obj_3 = pickle.load(file)
print(obj_1)
print(obj_2)
print(obj_3)
file.close()
pickle
하나 또는 여러 개를 저장하고 복원 하는 데 사용하는 객체 지향 데모를 제공합니다 object
.
class Worker(object):
def __init__(self, name, addr):
self.name = name
self.addr = addr
def __str__(self):
string = u'[<Worker> name:%s addr:%s]' %(self.name, self.addr)
return string
# output one item
with open('testfile.bin', 'wb') as f:
w1 = Worker('tom1', 'China')
pickle.dump(w1, f)
# input one item
with open('testfile.bin', 'rb') as f:
w1_restore = pickle.load(f)
print 'item: %s' %w1_restore
# output multi items
with open('testfile.bin', 'wb') as f:
w1 = Worker('tom2', 'China')
w2 = Worker('tom3', 'China')
pickle.dump([w1, w2], f)
# input multi items
with open('testfile.bin', 'rb') as f:
w_list = pickle.load(f)
for w in w_list:
print 'item-list: %s' %w
산출:
item: [<Worker> name:tom1 addr:China]
item-list: [<Worker> name:tom2 addr:China]
item-list: [<Worker> name:tom3 addr:China]
klepto
파일이나 데이터베이스에 객체를 투명하게 저장할 수있는 기능을 제공하는를 사용하면 쉽습니다 . dict API를 사용하며 아카이브에서 특정 항목 dump
및 / 또는 load
특정 항목을 허용합니다 (아래의 경우 직렬화 된 객체는라는 디렉토리에 파일 당 하나의 항목을 저장함 scores
).
>>> import klepto
>>> scores = klepto.archives.dir_archive('scores', serialized=True)
>>> scores['Guido'] = 69
>>> scores['Fernando'] = 42
>>> scores['Polly'] = 101
>>> scores.dump()
>>> # access the archive, and load only one
>>> results = klepto.archives.dir_archive('scores', serialized=True)
>>> results.load('Polly')
>>> results
dir_archive('scores', {'Polly': 101}, cached=True)
>>> results['Polly']
101
>>> # load all the scores
>>> results.load()
>>> results['Guido']
69
>>>
If you're dumping it iteratively, you'd have to read it iteratively as well.
You can run a loop (as the accepted answer shows) to keep unpickling rows until you reach the end-of-file (at which point an EOFError
is raised).
data = []
with open("data.pickle", "rb") as f:
while True:
try:
data.append(pickle.load(f))
except EOFError:
break
Minimal Verifiable Example
import pickle
# Dumping step
data = [{'a': 1}, {'b': 2}]
with open('test.pkl', 'wb') as f:
for d in data:
pickle.dump(d, f)
# Loading step
data2 = []
with open('test.pkl', 'rb') as f:
while True:
try:
data2.append(pickle.load(f))
except EOFError:
break
data2
# [{'a': 1}, {'b': 2}]
data == data2
# True
Of course, this is under the assumption that your objects have to be pickled individually. You can also store your data as a single list of object, then use a single pickle/unpickle call (no need for loops).
data = [{'a':1}, {'b':2}] # list of dicts as an example
with open('test.pkl', 'wb') as f:
pickle.dump(data, f)
with open('test.pkl', 'rb') as f:
data2 = pickle.load(f)
data2
# [{'a': 1}, {'b': 2}]
ReferenceURL : https://stackoverflow.com/questions/20716812/saving-and-loading-multiple-objects-in-pickle-file
'programing' 카테고리의 다른 글
redis cli를 사용하여 명령 배치 실행 (0) | 2021.01.17 |
---|---|
인수가있는 여러 줄 문자열. (0) | 2021.01.17 |
IntelliJ 빌드 오류 컨텍스트 불일치 (0) | 2021.01.16 |
코 아래에서 Python 코드를 테스트 할 때 로그 메시지를 어떻게 확인해야합니까? (0) | 2021.01.16 |
XSL xsl : 템플릿 일치 =“/” (0) | 2021.01.16 |