Python을 사용하면 지속적인 사전을 유지하고 수정할 수 있습니까?
-
22-07-2019 - |
문제
그래서 저는 사전을 영구 파일로 저장하고 싶습니다. 해당 파일의 사전에서 항목을 추가, 인쇄 또는 삭제하기 위해 일반 사전 방법을 사용하는 방법이 있습니까?
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로 가십시오. 기본적으로 키 : 값 쌍을 저장하도록 만들어졌습니다.