파이썬 dict를 문자열로 변환하고 다시 변환하십시오.


275

사전 객체에 데이터를 저장하는 프로그램을 작성하고 있지만이 데이터는 프로그램 실행 중 어느 시점에 저장되어 프로그램이 다시 실행될 때 사전 객체로 다시로드되어야합니다. 사전 객체를 파일에 쓰고 사전 객체로 다시로드 할 수있는 문자열로 어떻게 변환합니까? 이것은 사전을 포함하는 사전을 희망적으로 지원할 것입니다.

답변:


274

json 모듈 은 여기서 좋은 솔루션입니다. 일반 텍스트 출력 만 생성하고 크로스 플랫폼 및 크로스 버전이라는 피클보다 장점이 있습니다.

import json
json.dumps(dict)

2
이 모듈도 살펴볼 것입니다. json과 pickle은 사용하기에 충분히 쉬운 것처럼 보이므로 크로스 플랫폼 지원과 같은 것들이 있습니다. 감사합니다
AJ00200

5
이 시점에서 피클은 더 이상 사용되지 않는 것으로 보입니다. 나는 항상 이런 것들을 위해 json을 사용합니다. (상대적으로) 사람이 읽을 수 있다는 것은 많은 시간을 더한 시간입니다.
Tyler Eaves

30
사용자가이를 수행하는 방법을 볼 수 있도록 간단한 예를 추가해야합니다.
Miguel Vazq

1
@TylerEaves 어떻게해야하는지 예제를 제공 할 수 있습니까?
Boban

1
: headheadslap : import json내가 한 것처럼 잊지 마세요 !
Jesse Chisholm

207

사전이 너무 크지 않으면 str + eval이 작업을 수행 할 수 있습니다.

dict1 = {'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }}
str1 = str(dict1)

dict2 = eval(str1)

print dict1==dict2

소스를 신뢰할 수없는 경우 추가 보안을 위해 eval 대신 ast.literal_eval 을 사용할 수 있습니다 .


13
나는 이것이 코드에 도입 될 수있는 가능한 악용을 처리 할 준비가되지 않았습니다. 나는 json이나 pickle이 어떤 문제를 겪을 지 모르지만,이 경우 eval이 위험하다는 사실을 알고 있습니다.
AJ00200

5
@ AJ00200 : 내가 언급 한 ast.literal_eval 대안?. Python 도움말에서 : "식 노드 또는 Python 표현식을 포함하는 문자열을 안전하게 평가합니다. 제공된 문자열 또는 노드는 문자열, 숫자, 튜플, 목록, dicts, 부울 및 없음과 같은 Python 리터럴 구조로만 구성 될 수 있습니다. "값을 직접 구문 분석 할 필요없이 신뢰할 수없는 소스의 Python 표현식을 포함하는 문자열을 안전하게 평가하는 데 사용할 수 있습니다."
PabloG

는 유용하게 보이지만 이전에 SQLite를 사용 하여이 데이터를 처리하고 1500 개가 넘는 항목을 가지고 있었기 때문에 항상 커지고 커졌습니다.
AJ00200

164

나는 사용한다 json:

import json

# convert to string
input = json.dumps({'id': id })

# load to dict
my_dict = json.loads(input) 

14

pickle모듈을 사용하여 디스크에 저장하고 나중에로드하십시오.


2
@extraneon 사실, 그것은 질문에 대한 답변입니다. 어딘가에 문자열로 변환하여 파일에 씁니다. 피클에 의해 캡슐화되어 있기 때문에 실제 변환이나 파일 작성을 할 필요가 없습니다.
AJ00200

11

왜 파이썬 3의 붙박이 사용하지 AST의 라이브러리의 기능 literal_eval을 . eval 대신 literal_eval 을 사용하는 것이 좋습니다

import ast
str_of_dict = "{'key1': 'key1value', 'key2': 'key2value'}"
ast.literal_eval(str_of_dict)

실제 사전으로 출력을 제공합니다

{'key1': 'key1value', 'key2': 'key2value'}

그리고 사전을 문자열 로 변환하도록 요청하는 경우 str () 사용은 어떻습니까? Python의 메소드를 .

사전이 다음과 같다고 가정하십시오.

my_dict = {'key1': 'key1value', 'key2': 'key2value'}

그리고 이것은 다음과 같이 수행됩니다 :

str(my_dict)

인쇄합니다 :

"{'key1': 'key1value', 'key2': 'key2value'}"

이것은 당신이 원하는대로 쉽습니다.


5

Chinses에있는 경우

import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')

1
제공 한 코드가 질문에 어떻게 대답하는지 설명하면 더 나은 답변이 될 것입니다.
pppery

4

사전을 JSON으로 변환 (문자열)

import json 

mydict = { "name" : "Don", 
          "surname" : "Mandol", 
          "age" : 43} 

result = json.dumps(mydict)

print(result[0:20])

당신을 얻을 것입니다 :

{ "이름": "돈", "sur

문자열을 사전으로 변환

back_to_mydict = json.loads(result) 

3

나는 당신이 사용하는 것을 고려해야한다고 생각합니다 shelve영구적 인 파일 백업 사전과 유사한 객체를 제공 모듈 합니다. "실제"사전 대신 사용하기 쉽습니다. 사전에 문자열처럼 명시 적으로 변환 한 다음 파일에 쓸 필요없이 사전처럼 사용할 수있는 프로그램을 거의 투명하게 제공하기 때문입니다. 반대로).

가장 큰 차이점은 처음에 필요가되어 open()처음 사용하기 전에 다음 close()당신이 완료되면 (그리고 아마도 sync()그것을 보내고는에 따라writeback 사용중인 옵션에 입니다. 생성 된 "shelf"파일 객체에는 값으로 정규 사전이 포함되어 논리적으로 중첩 될 수 있습니다.

다음은 간단한 예입니다.

import shelve

shelf = shelve.open('mydata')  # open for reading and writing, creating if nec
shelf.update({'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }})
shelf.close()

shelf = shelve.open('mydata')
print shelf
shelf.close()

산출:

{'three': {'three.1': 3.1, 'three.2': 3.2}, 'two': 2, 'one': 1}

2

속도에 관심이 있다면 json과 동일한 API를 사용하는 ujson (UltraJSON)을 사용 하십시오 .

import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]

1

읽을 수 있어야하는 경우 (JSON도 XML도 IMHO도 아니거나) 읽기가 필요하지 않은 경우 피클을 사용하기 위해 yaml을 사용합니다.

쓰다

from pickle import dumps, loads
x = dict(a=1, b=2)
y = dict(c = x, z=3)
res = dumps(y)
open('/var/tmp/dump.txt', 'w').write(res)

다시 읽기

from pickle import dumps, loads
rev = loads(open('/var/tmp/dump.txt').read())
print rev

b여기서 파일을 열 때 실제로 플래그를 사용해야 합니다.
Piotr Dobrogost

1
나는 더 명백 할 수 있었다. 그러나 dumps()기본값은 프로토콜 0이며 이는 ASCII 프로토콜입니다. 'rb'IMHO가 필요하지 않은 이유 입니다.
Gerard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.