programing

객체 저장 및 로드 및 피클 사용

i4 2023. 6. 10. 08:19
반응형

객체 저장 및 로드 및 피클 사용

를 사용하여 개체를 저장하고 로드하려고 합니다.pickle모듈.
먼저 내 목표를 선언합니다.

>>> class Fruits:pass
...
>>> banana = Fruits()

>>> banana.color = 'yellow'
>>> banana.value = 30

그런 다음 'Frutes.obj'라는 파일을 엽니다(이전에 새 .txt 파일을 만들고 'Frutes.obj'로 이름을 변경했습니다).

>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)

이 작업을 수행한 후 세션을 닫고 새 세션을 시작한 후 다음 세션을 추가합니다(저장해야 하는 개체에 액세스하려고 시도).

file = open("Fruits.obj",'r')
object_file = pickle.load(file)

하지만 다음과 같은 메시지가 있습니다.

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
ValueError: read() from the underlying stream did notreturn bytes

저는 이 메시지를 이해하지 못해서 어떻게 해야 할지 모르겠습니다.내 물건 '바나나'를 어떻게 로드하는지 아는 사람 있나요?감사해요!

편집: 여러분 중 일부가 제안한 것처럼 다음과 같이 입력합니다.

>>> import pickle
>>> file = open("Fruits.obj",'rb')

문제는 없었지만, 다음에 제가 넣은 것은 다음과 같습니다.

>>> object_file = pickle.load(file)

그리고 오류가 있습니다.

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
EOFError

두 번째 문제에 대해서는:

 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Python31\lib\pickle.py", line
 1365, in load encoding=encoding,
 errors=errors).load() EOFError

파일 내용을 읽은 후에는 파일 포인터가 파일 끝에 있습니다. 더 이상 읽을 데이터가 없습니다.처음부터 다시 읽을 수 있도록 파일을 되감아야 합니다.

file.seek(0)

그러나 일반적으로 원하는 작업은 컨텍스트 관리자를 사용하여 파일을 열고 파일에서 데이터를 읽는 것입니다.이렇게 하면 블록 실행이 완료된 후 파일이 자동으로 닫히므로 파일 작업을 의미 있는 청크로 구성하는 데도 도움이 됩니다.


기록 노트:cPicklePython 3.x에서 자동으로 사용되는 C의 피클 모듈의 더 빠른 구현입니다. 그러나 Python 2.x에서는cPickle필요한 명시적 통화:

In [1]: import _pickle as cPickle

In [2]: d = {"a": 1, "b": 2}

In [4]: with open(r"someobject.pickle", "wb") as output_file:
   ...:     cPickle.dump(d, output_file)
   ...:

# pickle_file will be closed at this point, preventing your from accessing it any further

In [5]: with open(r"someobject.pickle", "rb") as input_file:
   ...:     e = cPickle.load(input_file)
   ...:

In [7]: print e
------> print(e)
{'a': 1, 'b': 2}

다음은 저에게 적합합니다.

class Fruits: pass

banana = Fruits()

banana.color = 'yellow'
banana.value = 30

import pickle

filehandler = open("Fruits.obj","wb")
pickle.dump(banana,filehandler)
filehandler.close()

file = open("Fruits.obj",'rb')
object_file = pickle.load(file)
file.close()

print(object_file.color, object_file.value, sep=', ')
# yellow, 30

이진법으로 읽는 것도 잊으셨군요.

쓰기 파트에는 다음이 있습니다.

open(b"Fruits.obj","wb") # Note the wb part (Write Binary)

읽기 파트에는 다음이 있습니다.

file = open("Fruits.obj",'r') # Note the r part, there should be a b too

따라서 다음으로 대체:

file = open("Fruits.obj",'rb')

그리고 그것은 효과가 있을 것입니다 :)


두 번째 오류는 파일을 제대로 닫거나 동기화하지 않았기 때문일 가능성이 높습니다.

이 코드를 사용해 보십시오.

>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
>>> filehandler.close()

다음은 (변경되지 않음)

>>> import pickle
>>> file = open("Fruits.obj",'rb')
>>> object_file = pickle.load(file)

더 깔끔한 버전은with진술.

작성용:

>>> import pickle
>>> with open('Fruits.obj', 'wb') as fp:
>>>     pickle.dump(banana, fp)

읽기용:

>>> import pickle
>>> with open('Fruits.obj', 'rb') as fp:
>>>     banana = pickle.load(fp)

이진 모드에서 항상 열기(이 경우)

file = open("Fruits.obj",'rb')

원하는 캐시를 사용하여 작업을 수행할 수 있습니다.기능이 있다고 가정할 때myfunc인스턴스를 생성합니다.

from anycache import anycache

class Fruits:pass

@anycache(cachedir='/path/to/your/cache')    
def myfunc()
    banana = Fruits()
    banana.color = 'yellow'
    banana.value = 30
return banana

모든 캐시 호출myfunc처음에 그리고 결과를 파일로 피클합니다.cachedir고유 식별자(함수 이름 및 인수에 따라 다름)를 파일 이름으로 사용합니다.연속적으로 실행하면 피클된 개체가 로드됩니다.

에 약에만.cachedir실행 실행에서 입니다. 행 사 이 에 보 개 이 는 python 가 실 니 옵 다 져 python 에 서 전 된 체 피 행 클 실 며존 되

함수 인수도 고려됩니다.리팩터 방식의 구현은 다음과 같이 작동합니다.

from anycache import anycache

class Fruits:pass

@anycache(cachedir='/path/to/your/cache')    
def myfunc(color, value)
    fruit = Fruits()
    fruit.color = color
    fruit.value = value
return fruit

이진 모드에서 파일을 열지 않았습니다.

open("Fruits.obj",'rb')

효과가 있어야 합니다.

두 번째 오류의 경우 파일이 비어 있을 가능성이 높습니다. 즉, 실수로 파일을 비웠거나 잘못된 파일 이름을 사용한 것입니다.

(이것은 세션을 정말로 종료했다고 가정하는 것입니다.그렇지 않으면 쓰기와 읽기 사이에 파일을 닫지 않았기 때문입니다.

당신 코드를 테스트해봤는데, 작동합니다.

를 여러하고, 를 사용하는 처럼 보입니다.pickle이것을 하는 좋은 방법입니다.하만지, 다과같패가있습다니키지은음▁called▁package다있라는 패키지가 있습니다.klepto사전 인터페이스에 객체를 저장하는 것을 추상화하므로 객체를 피클링하여 파일에 저장하거나(아래 그림 참조), 객체를 피클링하여 데이터베이스에 저장하거나, 피클 사용 json 또는 다른 많은 옵션을 사용하는 대신 선택할 수 있습니다.의 좋은 점.klepto즉, 공통 인터페이스로 추상화함으로써 파일에 피클링을 통해 저장하거나 파일에 저장하는 방법에 대한 하위 수준의 세부 정보를 기억할 필요가 없습니다.

동적으로 추가된 클래스 속성에 대해 작동하지만 피클은 할 수 없습니다...

dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive 
>>> db = file_archive('fruits.txt')
>>> class Fruits: pass
... 
>>> banana = Fruits()
>>> banana.color = 'yellow'
>>> banana.value = 30
>>> 
>>> db['banana'] = banana 
>>> db.dump()
>>> 

그런 다음 다시 시작합니다.

dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive
>>> db = file_archive('fruits.txt')
>>> db.load()
>>> 
>>> db['banana'].color
'yellow'
>>> 

Kleptopython2 및 python3 서합니다동작에.

여기에서 코드를 확인하십시오. https://github.com/uqfoundation

언급URL : https://stackoverflow.com/questions/4530611/saving-and-loading-objects-and-using-pickle

반응형