2015-01-20 4 views
2

나는 키와 값이 문자열, 정수 및 기타 딕테이션과 튜플 (json does not support those) 인 파이썬 dict을 가지고 있습니다. 나는 그것을 텍스트 파일에 저장하고 파일에서 읽으려고합니다. 기본적으로 (Lisp의 경우)과 같은 read이 필요합니다.사람이 읽을 수있는 방식으로 파이썬 사전을 텍스트로 직렬화하는 방법은 무엇입니까?

제약 :

  1. 파일을 사람이 읽을 수 있어야합니다 (따라서 pickle가 발생한 경우)
  2. 순환을 감지 할 필요가 없습니다.

json보다 좋은 점이 있습니까?

+4

당신의 추정 JSON보다 더 나은 뭔가를 무엇을 할 것인가? – BrenBarn

+0

@BrenBarn :'print'와 일치하는'read' – sds

+0

@sds 여러분이 읽어야 할 것은 입력 된 출력이 출력을위한 것입니다 ... 그들은 근본적으로 다른 두 가지입니다. –

답변

7

dict에서 repr()을 사용한 다음 다시 읽어서 ast.literal_eval()으로 구문 분석 할 수 있습니다. 파이썬 자체가 인간처럼 읽을 수 있습니다.

예 : 또한도 우호적 형식화 된 출력을위한 pprint 모듈을 사용하여 고려할 수 있습니다

In [1]: import ast 

In [2]: x = {} 

In [3]: x['string key'] = 'string value' 

In [4]: x[(42, 56)] = {'dict': 'value'} 

In [5]: x[13] = ('tuple', 'value') 

In [6]: repr(x) 
Out[6]: "{(42, 56): {'dict': 'value'}, 'string key': 'string value', 13: ('tuple', 'value')}" 

In [7]: with open('/tmp/test.py', 'w') as f: f.write(repr(x)) 

In [8]: with open('/tmp/test.py', 'r') as f: y = ast.literal_eval(f.read()) 

In [9]: y 
Out[9]: 
{13: ('tuple', 'value'), 
'string key': 'string value', 
(42, 56): {'dict': 'value'}} 

In [10]: x == y 
Out[10]: True 

.

+2

'simplejson'은 순진한'json'보다 약간 빠름에도 불구하고 이보다 더 빠른 속도를 나타냅니다. –

+2

@JoranBeasley 알아두면 좋을 것 같습니다. 나는 JSON과 비슷하게 사람이 읽을 수있는 것처럼 구현하기가 그다지 간단하지 않다고 생각할 수 없다. – user108471

+1

json이 튜플 키를 처리 할 수 ​​없다는 것을 감안할 때 이것은 _only_ 답변 인 것 같습니다. 감사. – sds

1

솔직히, json이 당신의 대답입니다. [편집 : 키가 문자열 인 한, 딕트에 대한 부분을 키로 보지 못했기 때문에] 적어도 5 년 만에 인수되었습니다. json에는 어떤 가독성 문제가 있습니까? json indenter, pretty-printer 유틸리티, 브라우저 플러그인 [1] [2]이 있습니다. 사용하는 것은 사람이 읽을 수있는 방법입니다. json (/ simplejson)도 매우 성능이 뛰어나며 (C 구현) 확장 가능하며 순차적으로 처리 할 수 ​​있으므로 AST 방식 (왜 편심하고 확장 성을 높이는가?)에 대해서는 말할 수 없습니다.

이것은 또한 여기에 답변하는 사람들의 100 %가 합의한 것처럼 보입니다. 모두가 잘못 될 수는 없습니다 ;-) XML은 죽었고, 좋은 속임수입니다.

  1. How can I pretty-print JSON? 및 수많은 다른
  2. Browser JSON Plugins
+0

죄송합니다, [ "json은 귀하의 답변은 BS입니다] (http://stackoverflow.com/questions/7001606/json-serialize-a-dictionary-with-tuples-as-key) – sds

+0

@sds : 설명해야합니다 왜, 당신은 단지 맹세를 게시 할 수 없습니다. 가치가있는 것을 위해, 나는 마지 못해 같은 결론을 내릴 때까지 2 년 동안 다른 형식으로 실험했다. 매우 견고한 이유가 있습니다 (파싱 속도, 성능, 표준화, 타사 도구/유틸리티/라이브러리). – smci

+0

@sds 또한 더 나은 방법을 분명히해야합니다 : OP의 AST 방식 또는 다른 것? – smci

관련 문제