programing

피클 파일에 여러 개체를 저장하고 로드하시겠습니까?

telecom 2023. 5. 15. 21:16
반응형

피클 파일에 여러 개체를 저장하고 로드하시겠습니까?

저는 게임에서 선수들을 위해 봉사하고, 선수들을 창조하고, 다른 것들을 만드는 수업이 있습니다.

나중에 사용하려면 이 플레이어 개체를 파일에 저장해야 합니다.피클 모듈을 사용해봤는데 여러 개체를 저장하고 다시 로드하는 방법을 모르겠습니다.그렇게 하는 방법이 있습니까? 아니면 목록과 같은 다른 클래스를 사용하여 목록에 개체를 저장하고 로드해야 합니까?

더 좋은 방법이 있습니까?

팀 피터스의 수락된 답변에 두 가지 추가 사항이 있습니다.

첫째, 파일 끝을 누를 때 로드를 중지하는 경우 피클한 항목 수를 별도로 저장할 필요가 없습니다.

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

반응형