正在等待继续编辑 - Python - 基础知识专题 - 配置文件与日志管理

简介: 正在等待继续编辑 - Python - 基础知识专题 - 配置文件与日志管理

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
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
C++ Python
部分仍在编辑文章 - Python基础专题 - 深度解析python中的赋值与拷贝
部分仍在编辑文章 - Python基础专题 - 深度解析python中的赋值与拷贝
28 0
|
1月前
|
存储 机器学习/深度学习 数据挖掘
Python编程语言:基础知识与实用代码示例
本文将带您走进Python编程世界,介绍Python的基础知识,并通过实用代码示例展示Python的魅力和应用。
35 0
|
9天前
|
存储 文件存储 Python
python基础知识(一)
python基础(一){编码,字符串格式化,数据类型,运算符,推导式(简化生成数据),函数编程,模块}
|
11天前
|
索引 Python
python 格式化、set类型和class类基础知识练习(上)
python 格式化、set类型和class类基础知识练习
33 0
|
12天前
|
Python
python基础知识
【4月更文挑战第15天】python基础知识
23 7
|
1月前
|
消息中间件 测试技术 Python
Python使用多线程解析超大日志文件
Python使用多线程解析超大日志文件
24 0
|
1月前
|
存储 数据库 Python
Loguru:Python中强大的日志库
Loguru:Python中强大的日志库
49 2
|
1月前
|
存储 安全 算法
Python如何在打印日志时隐藏明文密码?
Python如何在打印日志时隐藏明文密码?
35 0
|
1月前
|
Java Python
【python基础知识】python中怎么判断两个字符串是否相等
【python基础知识】python中怎么判断两个字符串是否相等
31 0