피클 파일에 여러 개체를 저장하고 로드하시겠습니까?
저는 게임에서 선수들을 위해 봉사하고, 선수들을 창조하고, 다른 것들을 만드는 수업이 있습니다.
나중에 사용하려면 이 플레이어 개체를 파일에 저장해야 합니다.피클 모듈을 사용해봤는데 여러 개체를 저장하고 다시 로드하는 방법을 모르겠습니다.그렇게 하는 방법이 있습니까? 아니면 목록과 같은 다른 클래스를 사용하여 목록에 개체를 저장하고 로드해야 합니까?
더 좋은 방법이 있습니까?
팀 피터스의 수락된 답변에 두 가지 추가 사항이 있습니다.
첫째, 파일 끝을 누를 때 로드를 중지하는 경우 피클한 항목 수를 별도로 저장할 필요가 없습니다.
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
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
이렇게 하면 파일에 얼마나 많은 피클이 들어 있는지 알 책임이 있습니다.위의 코드는 목록 개체 수를 먼저 선택하여 이를 수행합니다.
사용해 보십시오.
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()
만약 당신이 그것을 반복적으로 버린다면, 당신은 그것을 반복적으로 읽어야 할 것입니다.
루프를 실행하여(승인된 답변에 표시된 대로) 파일 끝에 도달할 때까지(가 상승된 시점) 행을 선택 해제할 수 있습니다.
data = []
with open("data.pickle", "rb") as f:
while True:
try:
data.append(pickle.load(f))
except EOFError:
break
검증 가능한 최소 예제
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
물론, 이것은 여러분의 물건들이 개별적으로 절여져야 한다는 가정하에 이루어진 것입니다.또한 데이터를 단일 개체 목록으로 저장한 다음 단일 피클/피클 해제 호출을 사용할 수 있습니다(루프 필요 없음).
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}]
다음을 사용하여 객체 지향 데모를 제공합니다.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
파일 또는 데이터베이스에 개체를 투명하게 저장할 수 있습니다.그것은 딕트 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
>>>
피클을 사용하여 두 개 이상의 사전을 덤프하고 다시 추출하는 방법은 다음과 같습니다.
import pickle
dict_1 = {1: 'one', 2: 'two'}
dict_2 = {1: {1: 'one'}, 2: {2: 'two'}}
F = open('data_file1.pkl', 'wb')
pickle.dump(dict_1, F)
pickle.dump(dict_2, F)
F.close()
=========================================
import pickle
dict_1 = {1: 'one', 2: 'two'}
dict_2 = {1: {1: 'one'}, 2: {2: 'two'}}
F = open('data_file1.pkl', 'rb')
G = pickle.load(F)
print(G)
H = pickle.load(F)
print(H)
F.close()
Employee 클래스의 파일에 개체를 저장했다고 가정합니다.다음은 파일에서 모든 개체를 하나씩 읽는 코드입니다.
e = Employee()
with open(filename, 'rb') as a:
while True:
try:
e = pickle.load(a)
e.ShowRecord()
except EOFError:
break
언급URL : https://stackoverflow.com/questions/20716812/saving-and-loading-multiple-objects-in-pickle-file
'programing' 카테고리의 다른 글
마지막으로 삽입한 ID에 대한 PostgreSQL 함수 (0) | 2023.05.15 |
---|---|
작업을 취소하려면 어떻게 해야 합니까?언제 다? (0) | 2023.05.15 |
a인지 확인하려면 어떻게 해야 합니까?NET 어셈블리는 x86 또는 x64용으로 제작되었습니까? (0) | 2023.05.15 |
Xcode 7이 *.dylib이 아닌 *.tbd로 표시되는 이유는 무엇입니까? (0) | 2023.05.15 |
파일 ....database1.mdf에 대해 자동 이름이 지정된 데이터베이스를 연결하지 못했습니다. (0) | 2023.05.15 |