有時候非得處理一些功能,需要寫一點小小像樣的程式。這時可能會安排稍微多一些可調控的設定,因此會自訂參數設定檔案。
參數檔格式有很多,有傳統的類 shell 的 Key/Value 變數填寫、Windows 有時會見到用中括號標示小節的 INI,比較新的 JSON 或 YAML 等類型。
在 Python 底下有 ConfigParser,可以快速建構一個 Config 設定,不用靠自己讀檔與 readline 判讀。
不過 ConfigParsor 預設為 INI 風格,通常只有 Key/Value。
要是有些設定值想要吃多個值,有沒有好一點的處理手法?
直覺上,通常會硬塞成逗號分隔再一次吃下來自己切。但這樣在使用上會醜醜的:要填寫多值設定參數會感覺設定值黏在一起。。。
好在,JSON 有一種變數格式叫做 JSON Array,這種 Array 用中括號放逗號分隔 list,並且允許多行判讀。
這邊看到的漂亮技巧就是在 INI 檔裡面接受 JSON Array,形成一個 JSON 混搭風的 INI 設定檔。
以下是一個簡易範例。
#!/usr/bin/python3
import os
import json
from configparser import ConfigParser
def process_cfgfile(cfg_file):
'''
Sample config file processing for python script
Mixed style of INI and JSON array (multiline)
'''
cfg = ConfigParser()
cfg.read(cfg_file)
# JSON arrays are converted to lists
normal_val = cfg.get("ini_part1", "normal_value")
array_val = json.loads(cfg.get("ini_part1", "array_value"))
return normal_val, array_val
if __name__ == "__main__":
scriptname = os.path.basename(__file__)
scriptdir = os.path.abspath(__file__)
cfgfile = os.path.abspath(os.path.dirname(scriptdir) + '/' +
'samplecfg_' + os.path.splitext(scriptname)[0] + '.ini')
normal_key, array_key = process_cfgfile(cfgfile)
print(normal_key)
print(array_key)
for ele in array_key:
print(ele)
執行效果如下
注意這邊 array 裡面的值要用雙引號(JSON 規則)
[user@localhost ~]$ python3 -m venv cfgtest [user@localhost ~]$ source cfgtest/bin/activate (cfgtest) [user@localhost ~]$ pip install configparser Collecting configparser Downloading https://files.pythonhosted.org/packages/2b/af/0e28626b47c84172a112397f034bb1b6349960ca6e0fe7c96666e0ccae69/configparser-5.2.0-py3-none-any.whl Installing collected packages: configparser Successfully installed configparser-5.2.0 WARNING: You are using pip version 19.3.1; however, version 22.1.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command. (cfgtest) [user@localhost ~]$
(cfgtest) [user@localhost ~]$ cat << EOF >> ./samplecfg_array_ini_test.ini [ini_part1] normal_value = "hello" array_value = ["value1", "value2", "value3"] EOF (cfgtest) [user@localhost ~]$ chmod +x array_ini_test.py (cfgtest) [user@localhost ~]$ ./array_ini_test.py "hello" ['value1', 'value2', 'value3'] value1 value2 value3 (cfgtest) [user@localhost ~]$
其實這篇筆記要作到的事情也是蠻容易查到的,只是沒有想到要查詢大概就會用其他手法處理,有時不盡滿意~因此紀錄一下。
另外,另外發現現在可能流行的是 ConfigObj,不確定這手法是否能沿用。。下次在試試。
參考資料
python - Lists in ConfigParser - Stack Overflow
Reading array from config file in python - Stack Overflow
How to parse a configuration file into a list in Python - kite
configparser — Configuration file parser — Python 3.10.0 documentation
Reading array from config file in python - Genera Codice
Getting a list from a config file with ConfigParser - Pretag
How to store dictionary and list in python config file? - py4u
沒有留言:
張貼留言