2013-03-03 3 views
1

을 보존 :파이썬 JSON 나는이 같은 파일이 인코딩

aarónico 
aaronita 
ababol 
abacá 
abacería 
abacero 
ábaco 
#more words, with no ascii chars 

내가 읽고 콘솔에 파일을 인쇄, 그것은 정확히 같은, 예상대로,하지만 난 할 인쇄 할 때 :

f.write(json.dumps({word: Lookup(line)})) 

이 대신 저장됩니다

{"aar\u00f3nico": ["Stuff"]} 

내가 예상하는 경우 :

{"aarónico": ["Stuff"]} 

나는 jason.loads()를 사용할 때 같은 것을 얻을 필요가 있지만, 인코딩을 수행하는 방법이나 작동 방법을 알지 못합니다.

편집

이 파일에 데이터를 저장하는 코드입니다 :

with open(LEMARIO_FILE, "r") as flemario: 
    with open(DATA_FILE, "w") as f: 
     while True: 
      word = flemario.readline().strip() 
      if word == "": 
       break 
      print word #this is correct 
      f.write(json.dumps({word: RAELookup(word)})) 
      f.write("\n") 

그리고이 사람은 사전 객체 데이터를로드하고 반환

with open(DATA_FILE, "r") as f: 
     while True: 
      new = f.readline().strip() 
      if new == "": 
       break 
      print json.loads(new) #this is not 

I을 키가 저장된 키와 같지 않으면 사전을 조회 할 수 없습니다.

편집 2

>>> import json 
>>> f = open("test", "w") 
>>> f.write(json.dumps({"héllö": ["stuff"]})) 
>>> f.close() 
>>> f = open("test", "r") 
>>> print json.loads(f.read()) 
{u'h\xe9ll\xf6': [u'stuff']} 
>>> "héllö" in {u'h\xe9ll\xf6': [u'stuff']} 
False 
+1

유니 코드 문자의 JSON 인코딩을보고 있습니다. * 정상입니다. 이것은 [RFC 4627 JSON] (http://www.ietf.org/rfc/rfc4627.txt?number=4627)과 완전히 호환됩니다 (2.5 절. 문자열 값 참조). –

+0

Json에서 데이터를 올바르게 저장 중입니다. 유니 코드 문자열은 사용자가 제시 한 형식으로 변환됩니다. –

+0

하지만 다시로드 할 때 전에 그대로 다시 변환합니다. – gcq

답변

6

이 정상 및 유효한 JSON 동작 입니다. \uxxxx 이스케이프는 파이썬에서 사용하는 이므로 파이썬 리터럴 표현과 문자열의 내용을 혼동하지 않도록하십시오. 파이썬 3.3에서

데모 :

파이썬 2.7에서
>>> import json 
>>> print('aar\u00f3nico') 
aarónico 
>>> print(json.dumps('aar\u00f3nico')) 
"aar\u00f3nico" 
>>> print(json.loads(json.dumps('aar\u00f3nico'))) 
aarónico 

:

>>> import json 
>>> print u'aar\u00f3nico' 
aarónico 
>>> print(json.dumps(u'aar\u00f3nico')) 
"aar\u00f3nico" 
>>> print(json.loads(json.dumps(u'aar\u00f3nico'))) 
aarónico 

단지 원시 바이트 문자열을 지정할 때 읽기에서 파일을 작성하고, (그리고 "héllö" 원시 바이트 문자열) 다음 아니요 유니 코드 데이터를 다루고 있습니다. 먼저 인코딩 된 데이터와 유니 코드 데이터의 차이점에 대해 알아야합니다.

Spolsky 조엘에 의해 네드 BATCHELDER

  • The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)에 의한 Python Unicode HOWTO

  • Pragmatic Unicode : 나는 다음과 같은 3 개 제품의 이상이 읽을 것을 권장 강하게너 운 좋았어. "héllö" 파이썬 원시 바이트 문자열 표현, 파이썬 그것을 자동으로 당신을 위해 디코딩 관리.파일에서 다시 읽은 값은 정상이며 정확합니다.

    >>> print u'h\xe9ll\xf6' 
    héllö 
    
  • +0

    내 질문에 편집 됨 – gcq

    +0

    @gcq : 인코딩을 지정하지 않고 파일을 여는 중입니다. 이 파이썬 2 또는 3, 당신은 * 알고 * 어떤 인코딩이 파일에 사용됩니까? –

    +0

    @gcq : 입력과 출력에'repr()'을 사용하면 내 대답과 같은 파이썬 세션을 제공하므로, 우리가 * 더 많은 세부 사항 *을 주어야한다. 디버그를 도울 수 있습니다.) –