0

このテキストファイルをPython辞書に変換しようとしています。

基本的なフォーマットは

"items_game"
{
    "game_info"
    {
        "first_valid_class"         "1"
        "last_valid_class"          "9"
        "first_valid_item_slot"     "0"
        "last_valid_item_slot"      "10"
        "num_item_presets"          "4"
    }
    "qualities"
    {
        "key"           "value"
    }
    ...
    "community_market_item_remaps"
    {
        "Supply Crate"
        {
            "Supply Crate 2"            "1"
            "Supply Crate 3"            "1"
        }
        "Decoder Ring"
        {
            "Winter Key"                "1"
            "Summer Key"                "1"
            "Naughty Winter Key 2011"   "1"
            "Nice Winter Key 2011"      "1"
            "Scorched Key"              "1"
            "Fall Key 2012"             "1"
            "Eerie Key"                 "1"
            "Naughty Winter Key 2012"   "1"
            "Nice Winter Key 2012"      "1"
        }
    }
}

このファイルはほとんど辞書ですが、完全ではありません。これを辞書に変換して、キーで辞書の各レベルにアクセスできるようにする方法はありますか?私は次のようなことをしたいと思います:

foreach key in dictName['items_game']['community_market_item_remaps']['Decoder Ring']:
    # do something

ご協力ありがとうございました。

4

2 に答える 2

4

これは醜いですが、リンクされたファイルが次のように仮定すると、うまくいくようですtest.txt:

import re

a = open('test.txt').read()

a = a.replace('\n', '').replace('\t', ' ')
a = a.replace('{', ':{').replace('}', '},\n')

b =  re.sub('(\".*?\") *(\".*?\")', r'\1:\2,', a)

b = "{%s}" % b

dictName = eval(b)
for key in dictName['items_game']['community_market_item_remaps']['Decoder Ring']:
    print key

出力は次のとおりです。

Fall Key 2012
Eerie Key
Nice Winter Key 2011
Nice Winter Key 2012
Summer Key
Scorched Key
Winter Key
Naughty Winter Key 2011
Naughty Winter Key 2012
于 2013-03-03T05:05:13.240 に答える
2

データをjsonに変換してから、jsonを変数に読み込みます。

test.txt

import re
import json
a = open('test.txt').read()
a = re.sub('"[ \t]*"', '":"', a)
a = re.sub('"\s+"', '","', a)
a = re.sub('"\s+{', '":{', a)
a = re.sub('}\s+"', '},"', a)
a = '{%s}' % a
b = json.loads(a)
于 2013-03-03T07:35:26.160 に答える