1

私はこのようなファイルを持っています:

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

キーが保存されたものと同じでない場合、辞書を検索できません。

編集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
4

1 に答える 1

6

これは正常で有効な JSON の動作です。\uxxxxエスケープはPythonでも使用されるため、Pythonのリテラル表現と文字列の内容を混同しないようにしてください。

Python 3.3 でのデモ:

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

Python 2.7 の場合:

>>> 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ö"が生のバイト文字列である場合) は、Unicode データを扱っていません。最初に、エンコードされたデータと Unicode データの違いについて学ぶ必要があります。次の 3 つの記事のうち少なくとも 2 つを読むことを強くお勧めします。

"héllö"Python の raw バイト文字列表現は幸運でした。Python はそれを自動的にデコードすることができました。ファイルから読み戻された値は、完全に正常で正しいものです。

>>> print u'h\xe9ll\xf6'
héllö
于 2013-03-03T10:22:35.670 に答える