Python - configParser模塊學習


configParser 模塊用於操作配置文件

注:Parser漢譯為“解析”之意。

配置文件的格式與windows ini文件類似,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值)。

為了更好的理解本文,我們先了解一下配置文件的組成及命名:配置文件(INI文件)由章節(section [sectionName] )、鍵、值組成(key=value or key:Value)。

 

# 新建一個config 文件 testconfig.ini

[DATABASE]
host = 50.23.190.57
username : TestYang
password = TestYang
port = 3306
database = TestDB

 

具體用法見一下代碼,寫的很詳細了。

#-*-coding:utf-8-*-
# Time:2017/10/18 22:30
# Author:YangYangJun

# 首先導入 ConfigParser 模塊

import ConfigParser

# 這里發現 上面這種大寫與下面的小寫都可以,只是導入的時候是如何寫的,下面實例化的時候就如何寫。

# import configparser

configFile = 'testconfig.ini'


# 1、創建ConfigParser 實例

config = ConfigParser.ConfigParser()

# 2、讀取配置文件

config.read(configFile)

# 3、獲取配置文件的章節序列

print config.sections()  # ['DATABASE']


# 4、獲取配置文件中對應章節所有鍵的序列

print config.options('DATABASE')  # ['host', 'username', 'password', 'port', 'database']

# 5、獲取配置文件中對應章節 對應鍵的值

print config.get('DATABASE','host') # 50.23.190.57


# 6、獲取配置文件中對應章節的所有鍵值對

print config.items('DATABASE')  # [('host', '50.23.190.57'), ('username', 'TestYang'), ('password', 'TestYang'), ('port', '3306'), ('database', 'TestDB')]



# 7、往配置文件中增加章節section

# 重新實例化一個對象,如果使用上面已經read的對象的話,write的時候會將已經讀的內容再寫一遍。
writeConfig = ConfigParser.ConfigParser()

# 8、增加章節section
writeConfig.add_section("UserInfo")

# 9、set 往配置文件中的[UserInfo]節點加入鍵值對

writeConfig.set("UserInfo",'username','TestYang')

writeConfig.set("UserInfo",'password','TestYangPassWord')

writeConfig.set("UserInfo",'age','18')

writeConfig.set("UserInfo",'country','China')

# 10、已追加的方式打開已經存在的文件,如果文件不存在則創建該文件

# writeConfig.write(open('testconfig.ini','a'))

# 上面的寫入代碼等價於下面的代碼
'''
f = open('testconfig.ini','a')
writeConfig.write(f)
'''

# 注意 如果 分開先寫  writeConfig.add_section("UserInfo") 然后在單獨執行set 會報如下錯誤
# 所以 add_section 和 set 要一起寫,一起執行
'''
  raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'UserInfo'
'''
# 寫入后的結果如下
'''
[UserInfo]
username = TestYang
password = TestYangPassWord
age = 18
country = China
'''


# 11、按照類型讀取指定section 的option 信息 有getint 同樣的還有getfloat、getboolean。

# 返回為string類型
print config.get("UserInfo",'age')
# 返回為int類型
print config.getint("UserInfo",'age')

# 12、移除option

config.remove_option('UserInfo','age')

# 13、 移除section, 移除節點后,節點下的鍵值對一起移除
config.remove_section('UserInfo')

# 只要有修改就要寫回文件保存
config.write(open("testconfig.ini", "w"))

# 其他格式的配置文件
# cf.write(open("test.conf", "w"))

 

 

執行后結果如下:

# 新建一個config 文件 testconfig.ini

[DATABASE]
host = 50.23.190.57
username : TestYang
password = TestYang
port = 3306
database = TestDB



[UserInfo]
username = TestYang
password = TestYangPassWord
age = 18
country = China

 

應用實例如下:

# 應用實例,可以新建一個py文件,將使用的方法封裝起來

class ReadConfig():
    def __init__(self):

        self.cf = ConfigParser.ConfigParser()
        self.cf.read(configFile)

    def get_UserInfo(self, username):
        value = self.cf.get("UserInfo", username)
        return value

    def get_http(self, name):
        value = self.cf.get("HTTP", name)
        return value

    def get_db(self, name):
        value = self.cf.get("DATABASE", name)
        return value


if __name__ == "__main__":
    getdata = ReadConfig()
    print  getdata.get_UserInfo("username") # TestYang
    print  getdata.get_db("database")  # TestDB

 

使用過程遇到問題

1、configparser讀取含有中文配置config.ini(Windows)顯示亂碼的解決方法

2、UnicodeDecodeError: 'gbk' codec can't decode bytes in position 243-244: illegal multibyte sequence

 以上問題處理方法:在read 方法中加入參數  encoding="utf-8-sig" 即可,支持python3

        self.cf = configparser.ConfigParser()
        # 處理配置文件中含中文字符的問題 ,UnicodeDecodeError: 'gbk' codec can't decode bytes in position 243-244: illegal multibyte sequence

        self.cf.read(configPath,encoding="utf-8-sig")

 

3、遇到的這個問題真是個坑,坑了我一天,最后終於通過對比打印內容輸出,發現了問題的關鍵。

[EMAIL]
Smtp_Server1 = 'smtp.mxhichina.com'
Smtp_Server2 = smtp.mxhichina.com

其實configparser 讀取配置文件的內容是原樣輸出的。

即讀取 Smtp_Server1  讀取的內容就是  'smtp.mxhichina.com', 而不是實際需要的 smtp.mxhichina.com

這里不像py文件中的 'smtp.mxhichina.com',py會將其處理為字符串,單作為參數時是 smtp.mxhichina.com

所以py文件可以這樣寫。

Smtp_Server = 'smtp.mxhichina.com'

 

4、關於smtplib發送測試報告遇到的問題。

發送郵件部分代碼

tmp = smtp.sendmail(sender, receiver, msg.as_string())
#正常郵件參數值如下
Smtp_Sender = 'dev@we.cn'
Smtp_Sender_Password = '322118'
Smtp_Receiver = ['ywert@we.cn','qwer@we.cn']

並且configparser是原樣讀取的

所以我就這樣寫了

Pre_Receiver = ['qwer@we.cn']

結果會提示發送失敗

{u"['wer@we.cn']": (500, 'Error: bad syntax')}
發送失敗!

 

然后嘗試着去掉列表符號以及引號嘗試一下。

Test_Receiver = qwer@we.cn

結果提示發送成功,並實際收到了郵件

但是結果如圖

這樣的結果還是有問題的,考慮到receiver 本就應該是列表結構的,所以后面再做一下處理

receiver = []
receiver.append(self.TReceiver)

這樣后郵件就顯示正常了。

整理后代碼如下

      receiver = []
            receiver.append(self.TReceiver)
            print receiver
            # 定義發件人,如果不寫,發件人為空
            self.msg['From'] = self.sender
            # 定義收件人,如果不寫,收件人為空,后發現其實msg['To'] = “,”.join(receiver) 這里是必須序列化的參數,不過不這樣就會出現上圖的問題,而其下面的那條語句其實不處理也能發送出去。

self.msg['To'] = ",".join(receiver)
 self.smtp.sendmail(self.sender, receiver, self.msg.as_string())

 

 

但是還有一個問題,那就收件人有多個情況如何處理了。

# 比如
receiver = 123456@qq.com/1254367@qq.com

處理代碼如下

self.receiver = []
        for n in str(self.value).split("/"):
            self.receiver.append(n)

“/” 是分隔符,可以根據 receiver  采用的分割而定。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM