파이썬 사전 저장


198

.csv 파일을 사용하여 Python에서 데이터를 가져오고 내보내는 데 익숙하지만 이에 대한 분명한 과제가 있습니다. json 또는 pck 파일에 사전 (또는 사전 세트)을 저장하는 간단한 방법에 대한 조언이 있습니까? 예를 들면 다음과 같습니다.

data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"

이것을 저장하는 방법과 다시로드하는 방법을 알고 싶습니다.


8
json 또는 pickle 표준 모듈에 대한 설명서를 읽었 습니까?
Greg Hewgill

답변:


444

피클 저장 :

try:
    import cPickle as pickle
except ImportError:  # python 3.x
    import pickle

with open('data.p', 'wb') as fp:
    pickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)

인수 에 대한 추가 정보 는 피클 모듈 설명서 를 참조하십시오 protocol.

피클 로드 :

with open('data.p', 'rb') as fp:
    data = pickle.load(fp)

JSON 저장 :

import json

with open('data.json', 'w') as fp:
    json.dump(data, fp)

sort_keys또는 좋은 indent결과를 얻으려면 추가 인수 를 제공하십시오. sort_keys 인수 는 키를 알파벳순으로 정렬하고 들여 쓰기 는 데이터 구조를 indent=N공백으로 들여 씁니다 .

json.dump(data, fp, sort_keys=True, indent=4)

JSON 로드 :

with open('data.json', 'r') as fp:
    data = json.load(fp)

4
JSON은 사전을 기본적으로 수행합니다 (영구적 인 목적으로 메모리에있는 동안 파이썬 사전이 정확히 동작하지는 않지만 동일합니다). 실제로 json의 기본 단위는 "Object"이며 {<string> : <value>}로 정의됩니다. 익숙해 보이나요? 표준 라이브러리의 json 모듈은 모든 Python 기본 유형을 지원하며 json에 대한 최소한의 지식으로 쉽게 확장하여 사용자 정의 클래스를 지원할 수 있습니다. JSON 홈페이지 는 인쇄 된 3 페이지가 넘는 언어로 언어를 완전히 정의하므로 빠르게 흡수 / 소화 할 수 있습니다.
Jonathanb

1
에 대한 세 번째 주장에 대해서도 아는 것이 pickle.dump좋습니다. 파일을 사람이 읽을 필요가 없다면 작업 속도를 크게 높일 수 있습니다.
Steve Jessop

11
당신이 추가하면 sort_keys들여 쓰기 덤프 호출에 인수를 사용하면 훨씬 더 예쁜 결과를 얻을. 예 : json.dump(data, fp, sort_keys=True, indent=4). 자세한 정보는 여기
juliusmh

1
아마 사용해야합니다pickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
Martin Thoma

1
Python 3의 경우import pickle
danger89

35

최소한의 예, 파일에 직접 쓰는 것 :

import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))

또는 안전하게 개 / 폐 :

import json
with open(filename, 'wb') as outfile:
    json.dump(data, outfile)
with open(filename) as infile:
    data = json.load(infile)

파일 대신 문자열로 저장하려면 다음을 수행하십시오.

import json
json_str = json.dumps(data)
data = json.loads(json_str)


5

파일에 쓰려면 :

import json
myfile.write(json.dumps(mydict))

파일에서 읽으려면 :

import json
mydict = json.loads(myfile.read())

myfile dict을 저장 한 파일의 파일 객체입니다.


json이 파일을 인수로 가져 와서 직접 쓰는 것을 알고 있습니까?

json.dump(myfile)json.load(myfile)
니클라스 R

5

직렬화 후 다른 프로그램의 데이터가 필요하지 않은 경우 shelve모듈을 강력히 권장합니다 . 그것을 영구 사전으로 생각하십시오.

myData = shelve.open('/path/to/file')

# check for values.
keyVar in myData

# set values
myData[anotherKey] = someValue

# save the data for future use.
myData.close()

2
전체 dict를 저장하거나 전체 dict를로드하려는 경우 json더 편리합니다. shelve한 번에 하나의 키에만 액세스하는 것이 좋습니다.
agf

3

pickle또는에 대한 대안이 필요한 경우을 json사용할 수 있습니다 klepto.

>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache        
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump() 
>>> 
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}

을 사용 klepto하면을 사용한 serialized=True경우 사전이 memo.pkl일반 텍스트 대신 절인 사전 으로 작성되었습니다 .

당신은 klepto여기에 갈 수 있습니다 : https://github.com/uqfoundation/klepto

dill파이썬에서 거의 모든 것을 직렬화 할 수 pickle있기 때문에 아마도 자체 피클 링에 대한 더 나은 선택 일 것입니다 dill. klepto또한 사용할 수 있습니다 dill.

당신은 dill여기에 갈 수 있습니다 : https://github.com/uqfoundation/dill

처음 몇 줄의 추가 점보 점보는 klepto사전을 파일, 디렉토리 컨텍스트 또는 SQL 데이터베이스에 저장하도록 구성 할 수 있기 때문 입니다. API는 백엔드 아카이브로 선택한 것과 동일합니다. 아카이브를 사용 load하고 dump아카이브와 상호 작용할 수있는 "아카이브 가능"사전을 제공합니다 .


3

이것은 오래된 주제이지만 완전성을 위해 Python 2와 3의 표준 라이브러리에 각각 포함 된 ConfigParser와 configparser를 포함해야합니다. 이 모듈은 config / ini 파일을 읽고 쓰고 (적어도 Python 3에서는) 사전과 같은 많은 방식으로 동작합니다. 여러 사전을 config / ini 파일의 별도 섹션에 저장하고 불러올 수 있다는 이점이 있습니다. 단!

파이썬 2.7.x 예제.

import ConfigParser

config = ConfigParser.ConfigParser()

dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}

# make each dictionary a separate section in config
config.add_section('dict1')
for key in dict1.keys():
    config.set('dict1', key, dict1[key])

config.add_section('dict2')
for key in dict2.keys():
    config.set('dict2', key, dict2[key])

config.add_section('dict3')
for key in dict3.keys():
    config.set('dict3', key, dict3[key])

# save config to file
f = open('config.ini', 'w')
config.write(f)
f.close()

# read config from file
config2 = ConfigParser.ConfigParser()
config2.read('config.ini')

dictA = {}
for item in config2.items('dict1'):
    dictA[item[0]] = item[1]

dictB = {}
for item in config2.items('dict2'):
    dictB[item[0]] = item[1]

dictC = {}
for item in config2.items('dict3'):
    dictC[item[0]] = item[1]

print(dictA)
print(dictB)
print(dictC)

파이썬 3.X 예제.

import configparser

config = configparser.ConfigParser()

dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}

# make each dictionary a separate section in config
config['dict1'] = dict1
config['dict2'] = dict2
config['dict3'] = dict3

# save config to file
f = open('config.ini', 'w')
config.write(f)
f.close()

# read config from file
config2 = configparser.ConfigParser()
config2.read('config.ini')

# ConfigParser objects are a lot like dictionaries, but if you really
# want a dictionary you can ask it to convert a section to a dictionary
dictA = dict(config2['dict1'] )
dictB = dict(config2['dict2'] )
dictC = dict(config2['dict3'])

print(dictA)
print(dictB)
print(dictC)

콘솔 출력

{'key2': 'keyinfo2', 'key1': 'keyinfo'}
{'k1': 'hot', 'k2': 'cross', 'k3': 'buns'}
{'z': '3', 'y': '2', 'x': '1'}

config.ini의 내용

[dict1]
key2 = keyinfo2
key1 = keyinfo

[dict2]
k1 = hot
k2 = cross
k3 = buns

[dict3]
z = 3
y = 2
x = 1

1

json 파일로 저장하는 경우 가장 쉽고 쉬운 방법은 다음과 같습니다.

import json
with open("file.json", "wb") as f:
    f.write(json.dumps(dict).encode("utf-8"))

json.dump( )다른 답변에 요약 된 것보다 이것이 더 쉬운 가요?
baxx

0

내 유스 케이스는 여러 json 객체를 파일에 저장하는 것이었고 marty의 대답 이 다소 도움이되었습니다. 그러나 내 유스 케이스를 제공하기 위해 새 항목을 저장할 때마다 이전 데이터를 덮어 쓰므로 답변이 완료되지 않았습니다.

파일에 여러 항목을 저장하려면 이전 내용을 확인해야합니다 (예 : 쓰기 전에 읽음). json 데이터를 보유하는 일반적인 파일 은 루트 list또는 object루트를 갖습니다 . 그래서 내 json 파일에는 항상 list of objects데이터가 있고 그것에 데이터를 추가 할 때마다 목록을 먼저로드하고 새 데이터를 추가하고 쓰기 가능한 전용 파일 인스턴스 ( w)에 다시 덤프한다고 생각했습니다 .

def saveJson(url,sc): #this function writes the 2 values to file
    newdata = {'url':url,'sc':sc}
    json_path = "db/file.json"

    old_list= []
    with open(json_path) as myfile:  #read the contents first
        old_list = json.load(myfile)
    old_list.append(newdata)

    with open(json_path,"w") as myfile:  #overwrite the whole content
        json.dump(old_list,myfile,sort_keys=True,indent=4)

    return "sucess"

새로운 json 파일은 다음과 같습니다.

[
    {
        "sc": "a11",
        "url": "www.google.com"
    },
    {
        "sc": "a12",
        "url": "www.google.com"
    },
    {
        "sc": "a13",
        "url": "www.google.com"
    }
]

참고 :라는 이름의 파일이 필수적이다 file.json와 함께 []작업이 접근 방식의 초기 데이터로를

추신 : 원래 질문과 관련이 없지만이 방법은 먼저 항목이 이미 존재하는지 (1 / 다중 키 기반) 확인한 다음 데이터를 추가하고 저장하여 더 향상 될 수 있습니다. 누군가가 그 수표를 필요로하는지 알려주십시오. 나는 대답에 추가 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.