2013-08-07 3 views
2

그래서 나는 python에 익숙하지 않으며 (물론 아직 답을 얻지 못했다면) 학습 과정 전반에 걸쳐 많은 멍청한 질문을 할 것입니다.여러 사전을 pickling

하나의 질문은 피클을 사용하여 하나의 텍스트 파일에 여러 개의 사전을 저장하는 방법이 있거나 각 개별 사전을 별도의 파일로 저장해야하는 경우에 하나의 질문입니다. 예를 들어 웹 계정을 관리하는 프로그램을 만들고 각 계정에 다양한 임의의 키/값이있는 경우이 개별 계정을 하나의 아카이브에 별도의 사전으로 저장할 수 있습니까?

미리 감사 드리며 멍청한 놈이 예제 코드 및/또는 제안을 부탁드립니다.

답변

6

빠른 해결책 중 하나는 두 사전을 목록에 배치 한 다음 목록을 pickle하는 것입니다.

다음은 이진 파일로 쓰는 예제입니다.

import cPickle as pkl 

    MyFirstDict = { "hat": 7, "carpet": 5 } 
    MySecondDict = { "syrup":15, "yogurt": 18 } 

    MyDicts = [MyFirstDict, MySecondDict] 

    pkl.dump(MyDicts, open("myDicts.p", "wb")) 

로드하는 사람은 다음과 같습니다.

import cPickle as pkl 

    myDicts = pkl.load(open ("myDicts.p", "rb")) 

파일을 사람이 읽을 수 있어야하는 경우 일반 텍스트 파일로 대신 작성하는 것이 좋습니다. 경고 메시지는 훨씬 효율적이지 않으며 웹 계정 데이터와 같은 데이터에 특히 노출됩니다.

MyFirstDict = { "hat": 7, "carpet": 5 } 
    MySecondDict = { "syrup":15, "yogurt": 18 } 

    MyDicts = [MyFirstDict, MySecondDict] 

    outputFile = open("myDicts.txt", "w") 
    outputFile.write(str(MyDicts)) 
    outputFile.flush() 
    outputFile.close() 

그리고 다시 ...

import ast 

    inputFile = open("myDicts.txt", "r") 
    lines = inputFile.readlines() 

    objects = [] 
    for line in lines: 
     objects.append(ast.literal_eval(line)) 

    myDicts = objects[0] 

참고 문헌을 읽을 수 :

피클 텍스트 - 투 - 객체 솔루션 http://wiki.python.org/moin/UsingPickle

// 소스

// 참조 Python convert string object into dictionary

0

여러 개의 물체를 여러 가지 방법으로 산 세척 할 수 있습니다. 어떤 것이 최선인지는 유스 케이스에 조금 달려있다.

하나의 옵션으로 모든 별도의 계정 사전을 목록 또는 사전 (계정 ID로 입력)과 같은 더 큰 데이터 구조로 변환 할 수 있습니다. 그런 다음 더 큰 데이터 구조를 선택하면 계정 데이터가 한 번에 저장됩니다. Pickle의 형식은 텍스트가 아니라 바이너리입니다. 사람이 읽을만한 것을 원하면 json 또는 yaml을 대신 사용해야합니다.

또 다른 옵션은 여러 피클 값을 파일에 순서대로 쓰는 것입니다. 이것은 예상대로 작동하며, 단지 pickle.dump을 반복적으로 호출하여 저장하고, pickle.load을 반복적으로 불러올 수 있습니다.이 방법의 한 가지 단점은 필요한 특정 데이터 항목을 쉽게 검색 할 수 없다는 것입니다. 원하는 것을 찾을 때까지 순서대로로드를 유지해야합니다. 다른 하나는 여러 번 절인 된 개체의 ID가 손실된다는 것입니다 (로드 할 때 값은 같지만 같은 개체에 대한 참조는 아님). 장점은 파일을 다시 읽지 않고 이전 내용을 읽지 않고도 파일 끝에 더 많은 데이터를 추가 할 수 있다는 것입니다.

세 번째 옵션은 표준 라이브러리의 shelve 모듈을 사용하는 것입니다. 사전과 다소 유사하지만 키와 값은 파일로 저장됩니다. 위의 개별 피클의 찾기 문제를 해결할 수는 있지만 값 사이의 객체 동일성 손실을 수정하지는 않습니다.

최종 아이디어는 피클을 전혀 사용하지 않고 실제 데이터베이스 시스템을 사용하는 것입니다. 이것은 코드하기가 조금 어려울 수 있지만 그렇지 않으면 해결하기 어려울 수있는 동시성 및 데이터 무결성 문제를 피할 수 있습니다.

관련 문제