2011-08-09 2 views
4

PyYAML 외에도 정확히 unicode/str을 처리하는 안전한 Python 데이터 직렬화 라이브러리가 있습니까?str/유니 코드를 올바르게 처리하는 파이썬 저장 직렬화?

예를 들어

: 나는 (밖으로 너무 picklemarshel)에 시리얼이 안전되고 싶어하고, PyYAML는 옵션입니다,하지만 난 YAML의 복잡성을 싫어하는

>>> json.loads(json.dumps([u"x", "x"])) 
[u'x', u'x'] # Both unicode 
>>> msgpack.loads(msgpack.dumps([u"x", "x"])) 
['x', 'x'] # Neither are unicode 
>>> bson.loads(bson.dumps({"x": [u"x", "x"]})) 
{u'x': [u'x', 'x']} # Dict keys become unicode 
>>> pyamf.decode(pyamf.encode([u"x", "x"])).next() 
[u'x', u'x'] # Both are unicode 

주, 그래서 다른 옵션이 있는지 알고 싶습니다.

편집 : 내 데이터의 특성에 약간의 혼란이있는 것으로 보입니다. 그들 중 일부는 유니 코드 (예, 이름)이고 일부는 바이너리 (예 : 이미지)입니다. 따라서 unicodestr을 혼동하는 직렬화 라이브러리는 "42"42을 혼동하는 라이브러리와 마찬가지로 저에게 쓸모가 없습니다.

In [7]: ast.literal_eval (repr({"d": ["x", u"x"]})) 
Out[7]: {'d': ['x', u'x']} 
+0

정보가 정보에서 '유니 코드'또는 '바이트'인지 확인해야합니까? 로드를 수행하는 메소드에서 처리 할 수 ​​없습니까? – agf

+1

네, 꽤 확신합니다 ... 두 가지 이유가 있습니다. 먼저 파이썬 2.6은'unicode'가 함수에 대한 키워드 인수로 사용되면 폭발합니다 (예 :'foo (** {u "bar": 42})). 두 번째로 나는'유니 코드 '데이터를 다루고 있습니다. 그리고 몇몇'bytes' 데이터를 가지고 있고, 직렬화 라이브러리가 나를 추적 할 수 있다면 * 아주 * 좋을 것입니다. –

답변

1

당신이 bert를 시도 :

+0

흥미 롭군요 ... 꽤 좋아 보입니다. 직렬화 된 객체의 크기가 수용 가능한지 알아보기 위해 실험 해보아야하지만 ... 일부는 우스운 것처럼 보입니다 (예 :'len (bert.encode (u "")) == 40'). –

3

는 어쩌면 단지 값을 저장하고 ast.literal_eval 방법을 사용하여 직렬화하기 위해 파이썬의 repr를 사용할 수 있습니까?

>>> import bert 
>>> bert.decode(bert.encode([u"x", "x"])) 
[u'x', 'x'] 
>>> bert.decode(bert.encode({"x":[u"x", "x"]})) 
{'x': [u'x', 'x']} 

+0

이것은 ... 상당히 합리적입니다. 그러나,'__repr__'은 직렬화 형식이 아니기 때문에, 사용하기에 지칠 것입니다 : 안정적이라는 보장은 없으며 직렬화 오류를 잡아 내지 못할 것입니다 (예를 들어' 소켓 '). –

1

같은 일을 찾고 난 use_bin_type와 그 msgpack - 파이썬 0.4은 이제 지원 STR/유니 코드 발견 (this outstanding pull request이의 때문에 설치, 당신은 수동으로 erlastic 먼저 설치해야합니다)/인코딩 인수 :

>>> msgpack.unpackb(msgpack.packb(["uu\x00u", u"adsa\xe4"], use_bin_type=True, encoding="utf-8"), encoding="utf-8") 
['uu\x00u', u'adsa\xe4'] 
관련 문제