Python中使用配置文件
由于博主水平有限,疏忽在所难免。
邮箱:291148484@163.com
希望对大家所有帮助,感谢朋友们的支持与鼓励!
【导论】 这实际上是一个实战相关的话题,因为很难想象很难在一个实际应用的系统中不存在配置与日志。通过学习本文相关知识,你能学习到如何使用python创建和使用配置文件,如何创建和管理日志。本文将带你用一些案例与实战项目掌握相关内容。
1. 配置文件
1.1 配置文件地使用情景
在某些时候,如报表自动化小软件的开发实践中,我们很少做一个绚丽在这里插入代码片
GUI界面并配置一个小型数据库去记录相关的运行参数,但从软件的功能需求上,某些运行参数却需要依据特定的时间、空间条件做灵活的修改,这时我们就需要使用配置文件的方法来迅速地达到目的。
1.2 Python配置文件分析器
1.2.1 什么是INI
文件
1. INI文件简介
后缀为“.ini”的配置文件最初是仅windows的系统配置文件所采用的一个存储格式,由于这种格式表达意义清晰便且小巧简便,目前在编程中广泛应用。从本质上说INI
文件是一个存储字符流数据的文本文件,它与普通的文本文件相比有着特殊的数据表示结构。以下实例是某ini文件打开后的内容。
【Code1】INI文件结构示例。
; ini文件中可以用";"来表示注释 [Section1_Name] Key1Name = value1 Key2Name = value2 # ini文件中也可以用"#"来表示注释 [Section2_Name] Key1Name = value1 Key2Name = value2
从【Code1】中可以看出,其在结构上的特点是一个文件由多个部分组成,每个部分都称作一个SECTION
。
2. INI文件与字典
我们已经看到,INI文件的section与python中的字典在概念上十分类似,也是由键值对构成的。任意一个SECTION
都包含带有值的键,也就是说INI
文件是键值对结构,这一点在表面上看与Python中的字典除了记录的形式不同,其它的是没有区别的。如果你真的这样认为那就错了。请注意:
· INI文件的键值只能存储字符串数据!
根据我们以往的经验,Python的字典是一个复合的数据结构。现在请读者思考【Code2】中直接获取SECTION - “MySection”中键“FilePath ”和键“MyList”的值将得到什么。
【Code2】一个反例
[MySection] FilePath = r'C:\ProgramData\ssh' MyList = [1,2,3,4,5,6]
- 对于键FilePath,其值是我们在Windows系统中编程时常用的路径写法,我们期望获得的是这样一个表示路径的结果:“C:\ProgramData\ssh”,但实际上我们将获得的是完整的字符串"r’C:\ProgramData\ssh’"。其原因就在于INI文件存储的不是复合数据类型而仅仅只是字符串类型。
- 同理,在理解获取FilePath键值后键MyList的值就好理解了,我们是不会得到一个Python列表的,能得到的只是一个可以用于定义该列表的字符串“[1,2,3,4,5,6]”。
但是可能有读者说了,我就是想按照上面的写法表示我的路径或者表示一个复合的Python数据类型,那有没有方法呢?当然是有的。不过别急,我们在后边的内容将会有详细的介绍。
1.2.2 用Python操作INI文件
在讲解各种方法前,我们线给出一段INI文件代码如【Code3】所示,它将是我们本节讲解中创建或所用的INI文件内容:
【Code3】待创建或读取的INI文件的内容
[DEFAULT] Name = LiHua Age = 16 Gender = Male [Score] Chinese = 99 English = 63 Math = 90 Physics= 87 [XinDongFang.chef.com] RegistrationTime = 20201227 SuperUser = True
在Python中内建了配置文件分析器模块,我们只要按照如下方法导入configparser
模块即可使用。
【Code4】导入configparser模块
import configparser
1 . INI文件创建的方法
【Code5】函数式创建ini文件实例
# ** # @author:Jack Lee # ** import configparser # Import configparser module def ini_wrighter(savePath, *dicts): """Map multiple dictionaries to multiple Section and create a single INI file in the directory savePath""" config = configparser.ConfigParser() # Create an instance object of the class "configparser.ConfigParser" for i in dicts: if not isinstance(i,dict): raise ValueError('Only dict can be converted to a section in INI file!') section_name = str(i["SectionName"]) del(i["SectionName"]) config[section_name] = i with open(savePath, 'w') as configfile: # Save to file config.write(configfile) # Defines the first dictionary to be stored as an INI file DEFAULT = {"Name":"LiHua", "Age":16, "Gender":"Male", "SectionName":"DEFAULT"} # Defines the second dictionary to be stored as an INI file Score = {"Chinese":99, "English":63, "Math":90, "Physics":87, "SectionName":"Score"} # Define the third dictionary to be stored as INI file OtherInfos = {"RegistrationTime":"20201227", "SuperUser":True, "SectionName":"XDFang.chef.com"} savePath = r'C:\Users\JackLee\Desktop\myConfig.ini' # Call our defined function and store the configuration file ini_wrighter(savePath, DEFAULT, Score, OtherInfos)
运行上述代码,在我的电脑路径’C:\Users\JackLee\Desktop’下可以发现生成了一个新文件myConfig.ini:
打开该文件,显示内容如图2所示
你也许已经发现,虽然在Code5中定义存储到INI文件的字典的键值含有True这样的布尔值,但通过以上方法存储到INI文件时,被自动转换成了字符串,也就是说适应INI的字符串存储的这个过程是不需要我们认为编程实现的。
2. INI文件读取的方法
现在我们已经创建并保存了配置文件,下面让我们回读它。
【Code6】
import configparser def config_reader(path,section,key): """Extract "value" from a Section of the file according to "key""" config = configparser.ConfigParser() config.sections() # Get all section and return them as a list config.read(path, encoding="utf-8") if section == '': # If the specified section is an empty string, with open(path) as read_file: content = read_file.read() return content elif key == '': # Otherwise, first return the whole section as a Python dictionary read_dict = {} for a_key in config[section]: a_word = config[section][a_key] dictappend = {a_key:a_word,} read_dict.update(dictappend) # Insert a dictionary composed of new key-value pairs into the dictionary "read_dict" return read_dict else: word = config[section][key] # When both section name and key name are specified, the corresponding value is read out return word