1. 程式人生 > >最全總結 | 聊聊 Python 資料處理全家桶(配置篇)

最全總結 | 聊聊 Python 資料處理全家桶(配置篇)

![image](https://upload-images.jianshu.io/upload_images/1466987-12159a5ab2a559d8?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 1.前言 在實際專案中,經常會接觸到各種各樣的配置檔案,它可以增強專案的可維護性 常用配件檔案的處理方式,包含:JSON、ini / config、YAML、XML 等 本篇文章,我們將聊聊 Python 資料處理全家桶之配置檔案大總結 ## ​2.JSON Python 內建了 JSON 模組,可以非常方便操作 JSON 資料 常見的 4 個方法分別是: * json.load(json_file) 解析 JSON 檔案,轉換為 Python 中對應的資料型別 * json.loads(json_string) 解析 JSON 格式的字串,結果為 Python 中的字典 * json.dump(python_content,file_path) 將 Python 資料,包含:dict、list 寫入到檔案中 * json.dumps(python_dict) 將 Python 中 dict 轉為 JSON 格式的字串 以下面這段 JSON 配置檔案為例: ``` #config.json { "mysql": { "host": "198.0.0.1", "port": 3306, "db": "xh", "username": "root", "password": "123456", "desc": "Mysql配置檔案" } } ``` 1、讀取配置檔案 讀取配置檔案有兩種方式,分別是: 使用 json.load() 直接讀取配置檔案 或者,先讀取配置檔案中的內容,然後使用 json.loads() 轉換為 Python 資料型別 需要指出的是,面對複雜層級的 JSON 配置檔案,可以利用 jsonpath 進行讀取;jsonpath 類似於 xpath,可以通過正則表示式快速讀取資料 ``` import json def read_json_file(file_path): """ 讀取json檔案 :param file_path: :return: """ with open(file_path, 'r', encoding='utf-8') as file: # 讀取方式二選一 # 方式一 result = json.load(file) # 方式二 # result = json.loads(file.read()) # 解析資料 host_mysql = result['mysql']['host'] port_mysql = result['mysql']['port'] db = result['mysql']['db'] print('Mysql地址:', host_mysql, ",埠號:", port_mysql, ",資料庫:", db) ​ return result ``` 2、儲存配置檔案 使用 json 中的 json.dump() 方法,可以將一個字典寫入到 JSON 檔案中 ``` def write_content_to_json_file(output_file, content): """ 寫入到json檔案中 :param output_file: :param content: :return: """ with open(output_file, 'w') as file: # 寫入到檔案中 # 注意:為了保證中文能正常顯示,需要設定ensure_ascii=False json.dump(content, file, ensure_ascii=False) content_dict = { 'mysql': { 'host': '127.0.0.1', 'port': 3306, 'db': 'xh', 'username': 'admin', 'password': '123456', 'desc': 'Mysql資料庫' } } write_content_to_json_file('./output.json', content_dict) ``` 3、修改配置檔案 如果需要修改配置檔案,只需要先從配置檔案中讀出內容,然後修改內容,最後將修改後的內容儲存的配置檔案中即可 ``` def modify_json_file(): """ 修改json配置檔案 :return: """ result = read_json_file('./config.json') # 修改 result['mysql']['host'] = '198.0.0.1' write_content_to_json_file('./config.json', result) ``` ## 3.ini/config ini 配置檔案和 config 配置檔案的解析方式類似,僅僅是檔案字尾不一致 這裡我們以 ini 配置檔案為例 ``` # config.ini [mysql] host = 139.199.1.1 username = root password = 123456 port = 3306 ``` ini 檔案由 3 部分組成,分別是:節點(Section)、鍵(Key)、值(Value) 常見的 Python 處理 ini 檔案有兩種方式,包含: * 使用內建的 configparser 標準模組 * 使用 configobj第三方依賴庫 我們先來看看內建的 configparser 模組 3.1.1 讀取配置檔案 例項化一個 ConfigParser 解析物件,使用 read() 方法讀取 ini 配置檔案 ``` from configparser import ConfigParser # 例項化解析物件 cfg = ConfigParser() # 讀取ini檔案內容 cfg.read(file_path) ``` 使用 sections()函式,可以獲取所有的節點列表 ``` # sections() 得到所有的section,並以列表的形式返回 sections = cfg.sections() print(sections) ``` 要獲取某一個節點下的所有鍵,可以使用 options(section_name) 函式 ``` # 獲取某一個區域的所有key # cfg.options(section_name) keys = cfg.options('mysql') print(keys) ``` 通過 items(section_name) 函式,可以獲取某一個節點下的所有鍵值對 ``` # 獲取某一個區域下的鍵值對 items = cfg.items("mysql") print(items) ``` 如果要獲取某一個節點下,某一個鍵下的值,使用 get(section_name,key_name) 函式即可 ``` # 讀取某一個區域下的某一個鍵值 host = cfg.get("mysql", "host") print(host) ``` 3.1.2 寫入配置檔案 和讀取配置檔案類似,需要先例項化一個 ConfigParser 解析物件 首先,使用 add_section(section_name) 函式新增一個節點 ``` # 加入節點和鍵值對 # 新增一個節點 cfg.add_section("redis") ``` 然後,就可以使用 set(section_name,key,value) 函式往某一個節點新增鍵值對 ``` # 往節點內,新增鍵值對 cfg.set("redis", "host", "127.0.0.1") cfg.set("redis", "port", "12345") ``` 最後,使用 write() 函式寫入到配置檔案中去 ``` # 寫入到檔案中 cfg.write(open('./raw/output.ini', 'w')) ``` 3.1.3 修改配置檔案 修改配置檔案的步驟是,讀取配置檔案,然後通過 set(section_name,key,value) 進行修改操作,最後使用 write() 函式寫入到檔案中即可 ``` def modify_ini_file(file_path): """ 修改ini檔案 :return: """ cfg.read(file_path) cfg.set("mysql", "host", "139.199.11.11") # 寫入 cfg.write(open(file_path, "w")) ``` 接著,我們聊聊使用 configobj 操作 ini 配置檔案的流程 首先安裝 configobj 依賴庫 ``` # 依賴 # pip3 install configobj ``` 3.2.1 讀取配置檔案 直接將 ini 配置檔案路徑作為引數,使用 ConfigObj 類構造一個物件 ``` from configobj import ConfigObj # 例項化物件 config = ConfigObj(file_path, encoding='UTF8') ``` 檢視原始碼可以發現,ConfigObj 是 Section 節點的子類,而 Section 是 Dict 字典的子類 ![image](https://upload-images.jianshu.io/upload_images/1466987-2746bc128848a10b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 所以,可以直接通過鍵名 Key 獲取節點和鍵值