문제

그래서 저는 사전을 영구 파일로 저장하고 싶습니다. 해당 파일의 사전에서 항목을 추가, 인쇄 또는 삭제하기 위해 일반 사전 방법을 사용하는 방법이 있습니까?

CPICKLE을 사용하여 사전을 저장하고로드 할 수있는 것 같습니다.

도움이 되었습니까?

해결책

키 (반드시 값이 아님)가 문자열이라면 선반 표준 라이브러리 모듈은 원활하게 원하는 작업을 수행합니다.

다른 팁

JSON을 사용하십시오

Pete의 답변과 마찬가지로 JSON은 Python 데이터 구조에 매우 잘 맵핑되며 매우 읽을 수 있기 때문에 JSON을 사용하는 것을 좋아합니다.

지속적인 데이터는 사소한 일입니다.

>>> import json
>>> db = {'hello': 123, 'foo': [1,2,3,4,5,6], 'bar': {'a': 0, 'b':9}}
>>> fh = open("db.json", 'w')
>>> json.dump(db, fh)

그리고로드하는 것은 거의 동일합니다.

>>> import json
>>> fh = open("db.json", 'r')
>>> db = json.load(fh)
>>> db
{'hello': 123, 'bar': {'a': 0, 'b': 9}, 'foo': [1, 2, 3, 4, 5, 6]}
>>> del new_db['foo'][3]
>>> new_db['foo']
[1, 2, 3, 5, 6]

또한 JSON 로딩은 shelve 그리고 pickle IIRC는 피클보다 느립니다.

모든 작업에 쓰기를 원한다면 다음과 같습니다.

모든 작업을 저장하려면 Python Dict Object를 서브 클래스 할 수 있습니다.

import os
import json

class DictPersistJSON(dict):
    def __init__(self, filename, *args, **kwargs):
        self.filename = filename
        self._load();
        self.update(*args, **kwargs)

    def _load(self):
        if os.path.isfile(self.filename) 
           and os.path.getsize(self.filename) > 0:
            with open(self.filename, 'r') as fh:
                self.update(json.load(fh))

    def _dump(self):
        with open(self.filename, 'w') as fh:
            json.dump(self, fh)

    def __getitem__(self, key):
        return dict.__getitem__(self, key)

    def __setitem__(self, key, val):
        dict.__setitem__(self, key, val)
        self._dump()

    def __repr__(self):
        dictrepr = dict.__repr__(self)
        return '%s(%s)' % (type(self).__name__, dictrepr)

    def update(self, *args, **kwargs):
        for k, v in dict(*args, **kwargs).items():
            self[k] = v
        self._dump()

다음과 같이 사용할 수 있습니다.

db = DictPersistJSON("db.json")
db["foo"] = "bar" # Will trigger a write

비효율적으로 비효율적이지만 빠르게 지상에서 벗어날 수 있습니다.

프로그램을로드 할 때 파일에서 끊임없이, 프로그램이 실행중인 동안 메모리의 일반 사전으로 수정, 프로그램이 종료 될 때 피클에서 파일로 수정 하시겠습니까? 당신이 여기서 무엇을 더 많이 요구하는지 정확히 잘 모르겠습니다.

키와 값이 작동한다고 가정합니다 repr, 한 가지 해결책은 사전의 문자열 표현을 저장한다는 것입니다 (repr(dict)) 파일로. 당신은 그것을 사용하여로드 할 수 있습니다 eval 기능 (eval(inputstring)). 이 기술에는 두 가지 주요 단점이 있습니다.

1) IS는 사용 불가능한 구현이있는 유형과 함께 작동하지 않습니다 (또는 작동하는 것처럼 보이지만 실패 할 수도 있습니다). 무슨 일이 일어나고 있는지에 대해 최소한주의를 기울여야합니다.

2) 파일로드 메커니즘은 기본적으로 파이썬 코드를 직접 실행합니다. 입력을 완전히 제어하지 않으면 보안에 적합하지 않습니다.

그것은 하나의 이점이 있습니다 : 터무니없이 쉽게 할 수 있습니다.

내가 가장 좋아하는 방법 (표준 Python 사전 함수를 사용하지 않음) : YAML 파일을 읽고 쓰기/쓰기 pyyaml. 자세한 내용은이 답변을 참조하십시오, 여기에 요약 :

Yaml 파일 "Employment.yml"을 만듭니다.

new jersey:
  mercer county:
    pumbers: 3
    programmers: 81
  middlesex county:
    salesmen: 62
    programmers: 81
new york:
  queens county:
    plumbers: 9
    salesmen: 36

3 단계 : 파이썬에서 읽으십시오

import yaml
file_handle = open("employment.yml")
my__dictionary = yaml.safe_load(file_handle)
file_handle.close()

그리고 이제 나의 __dictionary에는 모든 가치가 있습니다. 이 작업을 즉시해야한다면 Yaml이 포함 된 문자열을 만들고 yaml.safe_load를 구문 분석하십시오.

산세는 한 가지 단점이 있습니다. 사전을 디스크에서 자주 읽고 쓰여야한다면 비용이 많이들 수 있습니다. 피클은 물건을 아래로 내립니다 (전체). uncikle은 (전체적으로) 물건을 가져옵니다.

작은 딕트를 다루어야한다면 피클은 괜찮습니다. 더 복잡한 작업으로 작업하려면 BerkelyDB로 가십시오. 기본적으로 키 : 값 쌍을 저장하도록 만들어졌습니다.

문자열 만 키로 사용하는 경우 ( shelve 모듈)는 충분하지 않습니다 제출 된 이 문제를 해결하는 좋은 방법 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top