これはかなり簡単にYAMLに簡素化することができます。 pip install pyyaml
、そのようにように設定:我々は、最初の行では
data2 = data.replace(":", ": ").replace("=", ":").replace("[","{").replace("]","}")
lines = data2.splitlines()
for i, line in enumerate(lines):
if len(line)>0 and line[-1] in string.digits and not line.endswith(",") or i < len(lines) - 1 and line.endswith("}"):
lines[i] += ","
data3 = "\n".join(lines)
yaml.load(data3) # {'a': 1, 'b': 2, 'c': {'x': 1, 'y': 2, 'z': 3}, 'd': 4}
説明
:
import string, yaml
data = """
{
a = 1
b = 2
c = [
x:1,
y:2,
z:3,
]
d = 4
}
"""
をこの設定では、あなたのデータを解析するために、次の使用することができますいくつかの単純な置換を実行してください:
- YAMLでは、キーと値のペアにコロンの後にスペースが必要です。だから
replace(":", ": ")
で、これを保証することができます。
- YAMLのキー/値のペアは、常にコロンで示されると、あなたのフォーマットは時々使用されているので、我々は
.replace("=", ":")
- あなたの形式は時々中括弧はYAMLで使用されるべきである角括弧を使用してを使用してコンマと等号を置き換える、等号。
{
a : 1
b : 2
c : {
x: 1,
y: 2,
z: 3,
}
d : 4
}
次に、我々はfor
ループを持っている:私たちはあなたのデータは次のようになり、この時点で.replace("[","{").replace("]","}")
を使用して固定します。これは、行が欠落している行の後にコンマを追加することになります。ループのために不足している2つの場合は、次のとおりです。 - 彼らは、数値 後に欠席している - 閉じ括弧
我々はlen(line)>0 and line[-1] in string.digits
で(最後の文字を使用して、これらの例最初にマッチした後、彼らは存在しています行は数字です)
2番目のケースはi < len(lines) - 1 and line.endswith("}")
を使用して一致します。これにより、行が}
で終わるかどうかがチェックされ、YAMLは最後の括弧の後にカンマを許可しないので、行が最後でないかどうかをチェックします。ループの後
、我々は持っている:有効なYAMLである
{
a : 1,
b : 2,
c : {
x: 1,
y: 2,
z: 3,
},
d : 4,
}
。残っているのはyaml.load
です。あなたは自分自身にPython dict
を持っています。
何かが明確でない場合は、コメントを残してください。私は喜んで丁寧に説明します。
[voluptuous](https://pypi.python.org/pypi/voluptuous)に慣れておくことをお勧めします。また、キーと値のペアは、改行でカンマで区切られていませんか? –
@ NathanielFord、正確にはそのフォーマット –
「保存する」ということを明確にすることはできますか? –