MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2022年7月12日 星期二

Python 的 ConfigParser 混搭 JSON Array

 有時候非得處理一些功能,需要寫一點小小像樣的程式。這時可能會安排稍微多一些可調控的設定,因此會自訂參數設定檔案。

參數檔格式有很多,有傳統的類 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

沒有留言:

張貼留言