python中configparser函数_python的ConfigParser函数和查找文件的方法(listdir,fnmatc,glod)...

前言

使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是configParser

configParser解析的配置文件的格式比较象ini的配置文件格式,就是文件中由多个section构成,每个section下又有多个配置项

ConfigParser简介

ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。

ConfigParser模块在python3中修改为configparser.这个模块定义了一个ConfigParser类,该类的作用是使用配置文件生效,配置文件的格式和windows的INI文件的格式相同

该模块的作用 就是使用模块中的RawConfigParser()、ConfigParser()、 SafeConfigParser()这三个方法(三者择其一),创建一个对象使用对象的方法对指定的配置文件做增删改查 操作。

ini文件结构需要注意一下几点:

键值对可用=或者:进行分隔

section的名字是区分大小写的,而key的名字是不区分大小写的

键值对中头部和尾部的空白符会被去掉

值可以为多行

配置文件可以包含注释,注释以#或者;为前缀

注意:configparser有default_section的概念,默认为[DEFAULT]节,也就是之后的所有的section都有该默认section中的键值对,详情参见configparser源码的__init__()方法

一、使用ConfigParser类解析ini配置文件

(PyCharm中实现)

实现查询、添加、删除、保存。

练习目的:

掌握文件基本操作

认识ini文件

了解ConfigParser类

使用ConfigParser类解析配置文件

ini配置文件的格式:

节: [session]

参数(键=值) name=value

1、解析mysql配置文件

**read(filename) 直接读取文件内容**

get(section, option) 获取section 下具体某一配置项的值(返回的是字符串)

sections() 得到所有的section,并以列表的形式返回

options(section) 得到该section的所有option

items(section) 键值对的形式 得到该section的所有option

getint(section,option)、cnf.getboolean(section,option)、getfloat(section,option) 获取整型、布尔型和浮点型的option的值

my.ini文件示例:

[client]

port = 3306

user = mysql

password = mysql

host = 127.0.0.1

[mysqld]

basedir = /usr

datadir = /var/lib/mysql

tmpdir = /tmp

skip-external-locking

2、ConfigParser类的使用方法

(1)创建configParser对象

In [1]: import configparser

In [2]: cf = configparser.ConfigParser(allow_no_value=True)

(2)读取配置文件内容

In [4]: cf.read('my.ini')

Out[4]: ['my.ini']

(3)获取配置文件信息

sections: 返回一个包含所有章节的列表

options: 返回一个包含章节下所有选项的列表

has_section: 判断章节是否存在

has_options: 判断某个选项是否存在

items: 以元组的形式返回所有的选项

get、getboolean、getint、getfloat: 获取选项的值

同时需要注意getboolean()方法能判断True/False的值有: ‘yes’/‘no’, ‘on’/‘off’, ‘true’/‘false’ 和 ‘1’/‘0’

In [4]: cf.sections() # 返回一个包含所有章节的列表

Out[4]: ['client','mysq1d']

In [5]: cf.has_section('client') # 判断章节是否存在

0ut[5]: True

In [6]cf.options('client ') # 判断某个选项是否存在

Out[6]: ['port", 'user', 'password', 'host' ]

In [7]: cf.has_option('client', 'user') # 判断某个选项是否存在

0ut[7]: True

In [8]: cf.get('client',' port') # 获取选项的值

0ut[8]: '3306'

In [9]: cf.getint('client','port') # 获取选项的值

0ut[9]: 3306

(4)修改配置文件

常用方法:

remove_section: 删除一个章节

add_section: 添加一个章节

remove_option: 删除一个选项

set: 添加一个选项

write: 将ConfigParser兑现中的数据保存到文件中

方法测试:

In [11]: cf.remove_section('client') # 删除一个章节

Out[11]: True

In [14]: cf.write(open('my.ini','w')) # 将ConfigParser兑现中的数据保存到文件中

#可在PyCharm中my.ini文件查看是否少了'client‘字段。

In [15]: cf.add.section('client') # 添加一个章节

In [16]: cf.set('client','port','3306') # 添加一个选项

In [17]: cf.set('client','user','mysq1') # 添加一个选项

In [18]: cf.set('client','password' 'mysq1') # 添加一个选项

In [19]: cf.set('client','host','127.0.0.1') # 添加一个选项

In [20]: cf.write(open('my.ini','w')) # 将ConfigParser兑现中的数据保存到文件中

#可在PyCharm中my.ini文件查看是否增加了'client‘字段。

In [21]: cf.remove_option('client', 'host') # 删除一个选项**

Out[21]: True

In [22]: cf.write(open('my.ini','w' )) # 将ConfigParser兑现中的数据保存到文件中

#可在PyCharm中my.ini文件查看是否减少了指定选项。

可在PyCharm上查看测试效果。

3、常见异常

异常

描述

ConfigParser.Error

所有异常的基类

ConfigParser.NoSectionError

指定的section没有找到

ConfigParser.DuplicateSectionError

调用add_section() 时,section名称已经被使用

ConfigParser.NoOptionError

指定的参数没有找到

ConfigParser.InterpolationError

当执行字符串插值时出现问题时,出现异常的基类

ConfigParser.InterpolationDepthError

当字符串插值无法完成时,因为迭代次数超过了最大的范围,所以无法完成。InterpolationError的子类

InterpolationMissingOptionError

当引用的选项不存在时,会出现异常。InterpolationError的子类

ConfigParser.InterpolationSyntaxError

当产生替换的源文本不符合所需的语法时,就会出现异常。InterpolationError的子类。

ConfigParser.MissingSectionHeaderError

当试图解析一个没有分段标题的文件时,会出现异常。

ConfigParser.ParsingError

当试图解析文件时发生错误时,会出现异常

ConfigParser.MAX_INTERPOLATION_DEPTH

当raw参数为false时,get()的递归插值的最大深度。这只适用于ConfigParser类

二、查找文件

PyCharm创建测试文件,格式如下:

G:\四期\python\ConfigParser\files>tree /f

卷 学习 的文件夹 PATH 列表

卷序列号为 7C11-994A

G:.

│ a.jpg

│ A.png

│ b.jpg

│ c.png

│ e.bmp

│ f.txt

│ ff.txt

│ find_file.py

│ find_file2.py

│ find_file3.py

└─test

测试一下

find_file.py

import os

for item in os.listdir('.'):

if os.path.isfile(item):

print(item)

输出结果如下:

a.jpg

A.png

b.jpg

c.png

e.bmp

f.txt

ff.txt

find_file.py

find_file2.py

find_file3.py

1、使用fnmatch找到特定文件

<1>fnmatch支持的通配符

字符

函数

*

匹配所有字符

匹配单个字符

[seq]

匹配指定范围内的字符

[!seq]

匹配不在指定范围内的字符

<2>fnmatch的基本使用

fnmatch这个库相对比较简单,只有4个函数,分别是fnmatch、fnmatchcase、filter和translate,其中最常用的是fnmatch。主要功能如下:

fnmatch:判断文件名是否符合特定的模式。

fnmatchcase:判断文件名是否符合特定的模式,区分大小写。

filter:返回输入列表中,符合特定模式的文件名列表。

translate:将通配符模式转换成正则表达式。

fnmatch和fnmatchcase用法相同,判断名称是否符合表达式,返回True or False

(1)fnmatch.fnmatch():一次只能处理一个文件

find_file2.py

import os

import fnmatch

for item in os.listdir('.'):

if os.path.isfile(item):

# if fnmatch.fnmatch(item,'*.jpg'):

# if fnmatch.fnmatch(item, '[a-e].*'):

# if fnmatch.fnmatch(item, '[a-z]?.txt'):

# if fnmatch.fnmatch(item, '[!a-c]*'):

print(item)

输出结果如下:

#输出以“.jpg”为结尾的文件

a.jpg

b.jpg

#输出以“a-e”为标题的文件

a.jpg

A.png

b.jpg

c.png

e.bmp

#输出以“a-z”和一个任意字符为标题,并且以“.txt”为后缀的文件

ff.txt

#输出除了以“a-c”为开通的文件

e.bmp

f.txt

ff.txt

find_file.py

find_file2.py

find_file3.py

(2)fnmath.filter():一次可以处理多个文件

find_file3.py

import os

import fnmatch

items = os.listdir('.')

files = fnmatch.filter(items, '[a-c]*')

print(files)

输出结果如下:

['a.jpg', 'A.png', 'b.jpg', 'c.png']

2、使用glob找到特定文件

glob模块支持的通配符:

通配符

功能

*

匹配0或多个字符

**

匹配所有文件、目录、子目录和子目录里的文件(3.5版本新增)

?

匹配1个字符,与正则表达式里的?不同

[exp]

匹配指定范围内的字符,如:[1-9]匹配1至9范围内的字符

[!exp]

匹配不在指定范围内的字符

标准库glob的作用相当于os.listdir()加上fnmatch。使用glob以后,不需要调用os.listdir获取文件列表,直接通过模式匹配即可。如下所示:

import glob

file = glob.glob('*.txt')

print(file)

输出结果如下:

['f.txt', 'ff.txt']

glob基本使用

glob和iglob的区别在于glob返回的是一个列表,iglob返回的是一个生成器对象

>>> import glob

>>> glob.glob('*.txt')

['a1.txt', 'a2.txt', 'aA.txt']

>>> g = glob.iglob('*.txt') # 使用iglob返回的是一个生成器

>>> g

>>> list(g)

['a1.txt', 'a2.txt', 'aA.txt']

>>>

PS:glob同样支持通配符和fnmatch相同,这里不在列举,并且在通配符表达式中支持路径

>>> glob.glob('/Users/DahlHin/github/test/*.txt')

['/Users/DahlHin/github/test/a1.txt','/Users/DahlHin/github/test/a2.txt','/Users/DahlHin/github/test/aA.txt']

总结:虽然glob模块可以很轻松地匹配特定文件和文件夹,但是仅仅支持少量的通配符,没办法像正则表达式一样匹配更复杂的字符串。使用的时候应当认真考虑使用场景,根据需求针对性地选择解决方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值