Python配置文件總結(jié)與避坑指南

關(guān)于今天的內(nèi)容

最近拿python在寫項目部署的相關(guān)集成代碼,本來兩天的工作量,硬是在來回的需求變更中,拖到了一周的時間。今天算是暫時告一段落了。這次由于涉及多個系統(tǒng)的調(diào)用和配置參數(shù),代碼開發(fā)中出現(xiàn)了較多之前未發(fā)現(xiàn)或者說沒暴露出來的問題,今天針對這些知識點進行相關(guān)的復(fù)習(xí)與總結(jié)

Python 配置文件管理

configparser是python推薦使用的配置文件管理模塊,但坦白說它真的不怎么好用,使用yaml、json等格式的存儲,在多層級數(shù)據(jù)存儲上,效率要比它高很多。但存在即合理,不是所有人都會使用yaml的格式,至于json的格式,很容易導(dǎo)致確實括號等問題,最終json.loads時報錯....
關(guān)于命名:
python2中模塊叫:ConfigParser
python3中更名為:configparser
eg:其實有時候懶得寫2和3的差別,但很多公司或者團隊至今還在使用python2,然后一導(dǎo)入報錯,就說是我的內(nèi)容寫的有問題,心累....
先來看看它的基本使用:
我們首先的定義一個配置文件:

[DEFAULT]
path = /home/python
version = 3.6.8
    Beta1
author = Qing_Feng_Python
number = 13

[Mysql]
creator = pymysql
host = 127.0.0.1
port = 3306
user = root
password = 123
database = mysqlDB
status = off
uri = %(user)s@%(host)s:%(port)s/%(database)s
  1. 配置文件分為

    • section 使用方括號包裹的名稱,區(qū)分大小寫
    • option 你可以理解為變量名稱,option及其對應(yīng)的值,不區(qū)分大小寫
  2. 配置文件中的鍵值對可以使用=或者:進行連接,但推薦使用=,為什么?因為=不會出現(xiàn)中文符號的異常問題!比如下面的報錯:

    configparser.ParsingError: Source contains parsing errors: 'config.ini'

  3. 鍵值對的分隔符及行首、行尾的空格會被strip()掉

  4. 關(guān)于DEFAULT,這個section幾乎在每個配置文件中都會出現(xiàn)

    • DEFAULT不會再conf.section()中顯示
    • 它類似于python的繼承,默認子section都會具備DEFAULT的內(nèi)容。當(dāng)子section中出現(xiàn)與DEFAULT同名的鍵,會覆蓋DEFAULT的原始內(nèi)容
  5. key:value中value可以存在多行,比如例子中的version,但換行后的內(nèi)容,切記不可定格寫,不然會被認為是key,而導(dǎo)致報錯。

  6. 配置文件中的value不管是int還是str亦或者表面看起來的列表[1,2,3]或者字典樣式{"name":"Urnaus"}都會被認為是str字符串類型。所以配置文件中,切記不要使用列表的樣式,推薦使用json格式,這樣可以通過json模塊進行字典的轉(zhuǎn)換

  7. 配置文件支持%(key)s的變量解析能力,些許的類似python....

說完了配置文件,再來說說怎么讀取配置文件吧:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清風(fēng)Python
# @Date     : 2019/6/8 22:30
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : PythonConfig.py
import configparser

# 初始化
conf = configparser.ConfigParser()
# 讀取配置文件
conf.read('config.ini', encoding='utf-8')
# 獲得配置文件中的所有sections
print(conf.sections())
# section是區(qū)分大小寫的,寫成小寫會被認為不存在
print(conf.has_section('mysql'))
# 獲取section = Mysql 下的所有options,即keys
print(conf.options('Mysql'))
# option 不區(qū)分大小寫,判斷結(jié)果為True
print(conf.has_option('Mysql', 'DATABASE'))
# 獲取section = Mysql 下的所有鍵值對
print(conf.items('Mysql'))
# 獲取section=Mysql下host鍵對應(yīng)的value值
# get方法通過不同類型,存在getint、getfloat、getboolean 不同的類型
# 其中g(shù)etboolean 可以識別 true/false、 1/0、yes/no、 on/off
print(conf.get('Mysql', 'host'))
print(conf.getboolean('Mysql', 'status'))
print(conf.get('Mysql', 'uri'))
# 刪除鍵值對,同樣的還設(shè)有remove_section(section)就不演示了...
# conf.remove_section('Mysql')
conf.remove_option('Mysql', 'status')


# 我們添加了section為Python,并創(chuàng)建了tools=Pycharm
# 打印顯示正常,但是配置文件中,并沒有
conf.add_section('Python')
conf.set("Python", "tools", "Pycharm")
print(conf.get("Python", "tools"))
# 此時的配置保存在內(nèi)存中,需要寫入文件方可生效
with open("config.ini", "w+") as f:
    conf.write(f)

output:
['Mysql']

False

['creator', 'host', 'port', 'user', 'password', 'database', 'status', 'uri', 'path', 'version', 'author', 'number']

True

[('path', '/home/python'), ('version', '3.6.8\nBeta1'), ('author', 'Qing_Feng_Python'), ('number', '13'), ('creator', 'pymysql'), ('host', '127.0.0.1'), ('port', '3306'), ('user', 'root'), ('password', '123'), ('database', 'mysqlDB'), ('status', 'off'), ('uri', 'root@127.0.0.1:3306/mysqlDB')]

127.0.0.1

False

root@127.0.0.1:3306/mysqlDB

Pycharm

大家可以看到,獲取option和items的時候,默認將DEFAULT中的參數(shù)也繼承進去了。
最后一行的變量解析,也正常顯示...
最后的寫入一定要切記,很多時候只是在內(nèi)存中進行了添加刪除,而未進行文件寫入,最終白玩一場....

關(guān)于列表的坑

在配置文件的存儲時我用到了列表,類似如下方式:

index_list = [.......]

if x not  in index_list:
    index_list.append(x)
else:
    pass

一段很平常的代碼,然后呢?問題讓我定位了好久,直接看個例子吧:

>>> index_list = [1,2,3]
>>> 2.0 not in index_list
False

其實這種情況在python中是普遍存在的,比如字典中

default_dict ={1:1,2:2}
default_dict[1.0]=2
default_dict
{1: 2, 2: 2}

為什么?python字典的key存儲時,比較哈希值來確定兩個鍵是否相同的

hash(1)==hash(1.0)
True

對于這些坑,你必須牢記在心,不然坑你沒商量....

The End

期待你關(guān)注我的公眾號清風(fēng)Python,如果你覺得不錯,希望能動動手指轉(zhuǎn)發(fā)給你身邊的朋友們。
我的github地址:https://github.com/BreezePython

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容