Pythonの構成ファイルから配列を読み取ります
-
28-09-2019 - |
質問
私は問題があります。私のプログラムは設定ファイルを使用してオプションを設定しています。これらのオプションの1つはタプルです。これが私の意味です:
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
など...これをPythonのconfigparserモジュールでタプルに解析できますか?これを行う簡単な方法はありますか?
解決
このような構成形式を変更できる場合:
folder = /home/scorpil
/media/sda5/
/media/sdb5/
次に、Pythonで:
config.get("common", "folder").split("\n")
他のヒント
あなたの構成は次のとおりです:
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder = ("/home/scorpil", "/media/sda5/", "/media/sdb5/")
foo.cfgという名前のファイルに構成があると仮定すると、次のことを行うことができます。
import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})
print folder
print type(folder)
生成するはずです:
( '/home/scorpil'、 '/media/sda5/'、 '/media/sdb5/')
u003Ctype 'tuple'>
- 編集 - それ以来、私はこれについて私の考えを変えました、そして、このコンテキストで評価を使用することは悪い考えであると今日の立場をとるでしょう。環境が制限されていても、構成ファイルがユーザー制御下にある場合、非常に悪い考えかもしれません。今日は、悪意のあるコードの実行を避けるために、Splitで面白いことをすることをお勧めします。
アイテムリストを取得し、リストの理解を使用して、名前が定義されたプレフィックスで始まるすべてのアイテムのリストを作成できます。 フォルダ
folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])
構成の作成:
folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))
ロード構成:
tuple(json.loads(config.get('common', 'folders')))
configparserはわかりませんが、リストに簡単に読むことができます(おそらく使用する .append()
)そして、そうします myTuple = tuple(myList)
#!/usr/bin/env python
sample = """
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match
def read_list(items,pmatch=FOLDER_MATCH):
if not hasattr(pmatch,"__call__"):
pmatch = re.compile(pmatch).match
folder_list = []
for k,v in items:
m = pmatch(k)
if m:
folder_list.append((int(m.group(1)),v))
return tuple( kv[1] for kv in sorted(folder_list) )
if __name__ == '__main__':
cp = ConfigParser.SafeConfigParser()
cp.readfp(StringIO(sample),"sample")
print read_list(cp.items("common"))
所属していません StackOverflow