5

たとえば、次のような Python の辞書があります。

{"a_summary" : 
   {"data1":{"length":100, "quality":10}, 
    "data2":{"length":90, "quality":9}},
"b_summary" :  
   {"data1":{"comments":19, "views":100}, 
    "data2":{"comments":9, "views":4}}}

そして、次のようなconfファイルに変換したいと思います:

[a_summary]
data1_length=100
data1_quality=10
data2_length=90
data2_quality=9

[b_summary]
data1_comments=19
data1_views=100
data2_comments=9
data2_views=4

ネストを表現する必要があるか、data1_または表現する必要があるのは少し奇妙に見えますが、今は問題ないようです。data2_

しかし、この conf ファイルを別のユーザーに送信する必要があり、別のユーザーはこの conf ファイルから元の辞書を復元する必要があります。ユーザーは、辞書を復元するためにさらにいくつかのコードを作成する必要があるようです。ただし、このソリューションは非常に汚いように見えます。

dictをconfファイルに保存するPythonicの方法があるかどうか疑問に思っていました(confファイルが適切でない場合は、プレーンテキストの他の読み取り可能な形式も受け入れられます)。その後、そのプレーンテキストファイルからdictを復元します。

4

5 に答える 5

7

configparserモジュールを見てください。それはあなたがやりたいことをするのを助けるかもしれません。

import configparser

data = {"a_summary" : {"data1":{"length":100, "quality":10}, 
            "data2":{"length":90, "quality":9}},
        "b_summary" :  {"data1":{"comments":19, "views":100}, 
            "data2":{"comments":9, "views":4}}}
config = configparser.ConfigParser()
for key1, data1 in data.items():
    config[key1] = {}
    for key2, data2 in data1.items():
        for key3, data3 in data2.items():
            config[key1]["{}_{}".format(key2, key3)] = str(data3)
with open('example.ini', 'w') as configfile:
    config.write(configfile)

そしてもう一度読むには:

config2 = configparser.ConfigParser()
config2.read('example.ini')
data = {}
for key in config2.sections():
    data[key] = {}
    for key2 in config2[key]:
        k1, k2 = key2.split('_')
        if k1 not in data[key]:
            data[key][k1] = {}
        data[key][k1][k2] = int(config2[key][key2])
于 2013-04-12T11:58:30.427 に答える
5

おそらくJSONとして保存します:

import json

with open('configfilename', 'w') as configfile:
    json.dump(yourdict, configfile, indent=2)

json.dump()ファイルを適度に読みやすくするためにインデントを設定しました。

ロード:

import json

with open('configfilename', 'r') as configfile:
    yourdict = json.load(configfile)

indent設定する2と、構造は次のように書き出されます。

{
  "a_summary": {
    "data1": {
      "length": 100, 
      "quality": 10
    }, 
    "data2": {
      "length": 90, 
      "quality": 9
    }
  }, 
  "b_summary": {
    "data1": {
      "comments": 19, 
      "views": 100
    }, 
    "data2": {
      "comments": 9, 
      "views": 4
    }
  }
}
于 2013-04-12T11:52:48.207 に答える
1

これは、ループやサードパーティのモジュールなしで行うことができます。

これは、辞書の深さに関係なく機能します。

from configparser import ConfigParser

data = {"a_summary" : {"data1":{"length":100, "quality":10}, 
            "data2":{"length":90, "quality":{"q1":1, "q2":{"am": "high", "pm": "low"}}}},
        "b_summary" :  {"data1":{"comments":19, "views":100}, 
            "data2":{"comments":9, "views":4}}}

# dict -> ConfigParser
config = ConfigParser()
config.read_dict(data)
with open('example.ini', 'w') as configfile:
    config.write(configfile)
    
# check result
with open('example.ini', 'r') as configfile2:
    print(configfile2.read())

# ConfigParser -> dict
config2 = ConfigParser()
config2.read('example.ini')
data2 = {section: dict(config2[section]) for section in config2.sections()}
print(data2)
于 2021-03-17T03:45:05.770 に答える
-1

JSON として書き出すだけで、同じものから復元できます。それでも非常に読みやすく、「INI」構文を超える基本的なデータ構造を簡単にサポートできます。

于 2013-04-12T11:52:56.487 に答える