Python函数和常用模块【day06】:shutil-shelve-xml-configparser模块

本节内容

  1. shutil模块
  2. shelve模块
  3. xml模块
  4. configparser模块

shutil模块

一、简述

  我们在日常处理文件时,经常用到os模块,但是有的时候你会发现,像拷贝、删除、打包、压缩等文件操作,在os模块中没有对应的函数去操作,下面我们就来讲讲高级的 文件、文件夹、压缩包 处理模块:shutil

二、模块详解

1、shutil.copyfileobj(fsrc, fdst)

功能:把一个文件的内容拷贝到另外一个文件中,可以是部分文件内容。


1

2

3

with open("f_old",‘r‘,encoding="utf-8") as f1,\

    open("f_new","w",encoding="utf-8") as f2:

    shutil.copyfileobj(f1,f2)    #拷贝文件的内容

注:经过试验,目前试验不出可以拷贝部分文件内容,先忘记可以拷贝部分内容把。

2、shutil.copyfile(src, dst)

功能:拷贝文件,但是不拷贝所有权限


1

2

shutil.copyfile("f_old","f_new")  #同一目录下拷贝文件

shutil.copyfile(r‘D:\PycharmProjects\pyhomework\day5\shutil_mode\shutil_mod\f_old‘,r‘d:\f_new‘)    #通过绝对路径拷贝文件

3、shutil.copymode(src, dst)

功能:拷贝文件的文件权限


1

2

3

4

5

6

7

8

9

10

11

12

[[email protected] ~]# ll

total 8

-rwxr-xr-1 root   root   0 Apr  1 16:05 zhangqigao   #有执行权限

-rw-r--r-- 1 whtest whtest 0 Apr  1 16:06 zhangqigao_old  #没有执行权限

>>> import os,shutil

>>> os.chdir("/root")

#拷贝"zhangqigao_old"权限给"zhangqigao"

>>> shutil.copymode("zhangqigao_old","zhangqigao"

[[email protected] ~]# ll

total 8

-rw-r--r-- 1 root   root   0 Apr  1 16:05 zhangqigao  # 获得跟"zhangqigao_old"一样的文件权限

-rw-r--r-- 1 whtest whtest 0 Apr  1 16:06 zhangqigao_old

4、shutil.copystat(src, dst)

功能:拷贝文件的状态信息,如:mode bits, atime, mtime, flags


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#两个文件的创建时间和用户权限都不同

[[email protected]_sh temp]# ll

total 0

-rw-r--r-- 1 root    root    0 Apr  1 17:31 zhangqigao

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

#python操作

>>> import os,shutil

>>> os.chdir("/temp")

#zhangqigao 这个文件状态

>>> os.stat("zhangqigao")

posix.stat_result(st_mode=33188, st_ino=76808194, st_dev=2053L, st_nlink=1,

st_uid=0, st_gid=0, st_size=0, st_atime=1491039109, st_mtime=1491039109,

st_ctime=1491039109)

#zhangqigao_old的文件状态

>>> os.stat("zhangqigao_old")

posix.stat_result(st_mode=33261, st_ino=76808195, st_dev=2053L, st_nlink=1,

st_uid=101, st_gid=103, st_size=0, st_atime=1491035188, st_mtime=1491035188,

st_ctime=1491035242)

#拷贝zhangqigao_old 文件状态给zhangqigao 文件

>>> shutil.copystat("zhangqigao_old","zhangqigao")

# 拷贝后,zhangqigao文件的文件状态

>>> os.stat("zhangqigao")

posix.stat_result(st_mode=33261, st_ino=76808194, st_dev=2053L, st_nlink=1,

st_uid=0, st_gid=0, st_size=0, st_atime=1491035188, st_mtime=1491035188,

st_ctime=1491039237)

#操作后两个文件比较

[[email protected]_sh temp]# ll

total 0

-rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao  #状态包括文件权限,文件创建的时间等,不包括文件所属用户和用户组

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

5、shutil.copy(src, dst)

功能:拷贝文件和文件的权限


1

2

3

4

5

6

7

8

9

10

11

12

13

#拷贝前

[[email protected]_sh temp]# ll

total 0

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

#拷贝中

>>> import os,shutil

>>> os.chdir("/temp")

>>> shutil.copy("zhangqigao_old","zhangqigao")

#拷贝结果输出

[[email protected]_sh temp]# ll

total 0

-rwxr-xr-1 root    root    0 Apr  1 17:42 zhangqigao  #拷贝了zhangqigao_old文件和文件权限

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

6、shutil.copy2(src, dst)

功能:拷贝文件和文件的状态


1

2

3

4

5

6

7

8

9

10

11

12

13

#拷贝前

[[email protected]_sh temp]# ll

total 0

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

#拷贝中

>>> import os,shutil

>>> os.chdir("/temp")

>>> shutil.copy2("zhangqigao_old","zhangqigao")

#拷贝后

[[email protected]_sh temp]# ll

total 0

-rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao  #拷贝了zhangqigao_old的文件和状态

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

7、shutil.copytree(src, dst)

功能:递归的去拷贝文件,相当于cp -r


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#操作前

[[email protected]_sh temp]# ll

total 4

drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao

[[email protected]_sh temp]# cd xiaogao/;ll

total 0

-rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

#操作中

>>> import os,shutil

>>> os.chdir("/temp")

>>> shutil.copytree("xiaogao","gaogao")  #递归拷贝

#操作结果

[[email protected]_sh temp]# ll

total 8

drwxr-xr-2 root root 4096 Apr  1 17:53 gaogao   #拷贝成功

drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao

[[email protected]_sh temp]# cd gaogao/;ll

total 0

-rwxr-xr-1 root root 0 Apr  1 16:26 zhangqigao

-rwxr-xr-1 root root 0 Apr  1 16:26 zhangqigao_old

9、shutil.rmtree(path[, ignore_errors[, onerror]])

功能:递归的去删除文件,相当于:rm -fr


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#操作前

[[email protected]_sh temp]# ll

total 4

drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao

[[email protected]_sh temp]# cd xiaogao/;ll

total 0

-rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao

-rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

#操作中

>>> import os,shutil

>>> os.chdir("/temp")

>>> shutil.rmtree("xiaogao")

#操作结果

[[email protected]_sh temp]# ll

total 0    #成功删除xiaogao目录

10、shutil.move(src, dst)

功能:递归的去移动文件 相当于:mv


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#操作前

[[email protected]_sh temp]# ll

total 4

drwxr-xr-2 root root 4096 Apr  1 18:07 xiaogao

-rw-r--r-- 1 root root    0 Apr  1 18:07 zhangqigao

#操作中

>>> import shutil

>>> shutil.move("/temp/zhangqigao","/temp/xiaogao")   #把文件移到目录中

#操作结果

[[email protected]_sh xiaogao]# ll

total 4

drwxr-xr-2 root root 4096 Apr  1 18:08 xiaogao

[[email protected]_sh temp]# cd xiaogao/;ll

total 0

-rw-r--r-- 1 root root 0 Apr  1 18:07 zhangqigao

三、压缩解压缩

1、shutil.make_archive((base_name, format, root_dir=None,base_dir=None,verbose=0,dry=0,owner=None,group=None,logger=None)

功能:创建压缩包并且返回文件路径,例如:zip,tar

  • base_name : 压缩包的文件名,也可以是压缩包的路径。只是文件名,则保存当前目录,否则保存到指定路径。
  • format:压缩包种类,‘zip‘,‘tar‘,‘bztar‘,‘gztar‘
  • root_dir:需要压缩的文件夹路径(默认当前路径)
  • owner:用户,默认当前用户
  • group:组,默认当前组
  • logger:用于记录日志,通常是logging.Logger对象

    1

1

2

3

4

5

6

7

8

#指定路径

>>> import shutil

#把/temp下的xiaogao文件以zip压缩格式压缩,并且存放在/temp/zhangqigao目录下,"/temp/zhangqigao/xiaogao" 中的xiaogao是压缩名

>>> shutil.make_archive("/temp/zhangqigao/xiaogao",‘zip‘,"/temp/xiaogao")   

‘/temp/zhangqigao/xiaogao.zip‘    #压缩结果

#默认当前路径

>>> shutil.make_archive("xiaogao",‘zip‘,"/temp/xiaogao")                

‘/temp/xiaogao.zip‘

2、zipfile

功能:以zip的形式压缩文件,注意了这个只能压缩文件,不能压缩目录,如果压缩,也只能显示空目录。


1

2

3

4

5

6

7

8

9

10

11

12

import zipfile

# 压缩

= zipfile.ZipFile(‘laxi.zip‘‘w‘)

z.write(‘a.log‘)  #写入

z.write(‘data.data‘)

z.close()   #关闭

# 解压

= zipfile.ZipFile(‘laxi.zip‘‘r‘)

z.extractall()   #解压

z.close()

3、tarfile

功能:以tar的形式打包文件,这边能打包所以文件,包括目录


1

2

3

4

5

6

7

8

9

10

11

12

13

14

import tarfile

# 打包

tar = tarfile.open(‘your.tar‘,‘w‘)

#不加arcname打的是绝对路径,也就是/Users/wupeiqi/PycharmProjects/bbs2.zip,加这个表示你在your.tar中加什么文件就写什么文件名,也就是bbs2.zip

tar.add(‘/Users/wupeiqi/PycharmProjects/bbs2.zip‘, arcname=‘bbs2.zip‘)

tar.add(‘/Users/wupeiqi/PycharmProjects/cmdb.zip‘, arcname=‘cmdb.zip‘)

tar.close()

# 解压

tar = tarfile.open(‘your.tar‘,‘r‘)

tar.extractall()  # 可设置解压地址

tar.close()

 小结:

  1. tar打包不会压缩文件,所以文件的大小没有变
  2. zip才会压缩,所以压缩后的文件大小会变小
  3. 一般情况下是先打包再压缩

shelve模块

一、简述

  之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,不能dump多次,和load多次,但是我们真想要dump多次和load多次怎么办呢,并且能事项数据的持久化呐?好吧,今天我们就来说说这个shelve模块。

二、shelve概念

1、持久化


1

2

3

4

5

6

7

8

9

10

11

12

13

import shelve   #导入shelve模块

def stu_data(name,age):   #定义一个函数

    print("register stu:",name,age)

name = ["test","zhang","qi","gao"]   #定义一个列表

info = "name":"zhangqigao","age":18#定义一个字典

with shelve.open("shelve_test") as d:

    d["test"= name    #持久化列表

    d["info"= info       #持久化字典

    d["func"= stu_data   #持久化函数

代码执行结果:

生成三个文件夹,分别是:shelve_test.dir、shelve_test.dat、shelve_test.bak

①shelve_test.dir内容


1

2

3

‘test‘, (050)

‘func‘, (102424)

‘info‘, (51248)

②shelve_test.dat内容


1

2

3

4

5

6

?]q (X   testqX   zhangqX   qiqX   gaoqe.

?}q (X   nameqX

   zhangqigaoqX   ageqKu.

?c__main__

stu_data

q .

③shelve_test.bak内容


1

2

3

‘test‘, (050)

‘func‘, (102424)

‘info‘, (51248)

2、解析文件内容


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import shelve

def stu_data(name,age):   #这边一定要定义相同名字的函数,不然执行报错

    print("stu:",name,age)

with shelve.open("shelve_test") as f:

    print(f[‘test‘])      #解析列表

    print(f[‘info‘])       #解析字典

    print(f["func"]("zhangqsan",22))   #解析函数

#输出

[‘test‘‘zhang‘‘qi‘‘gao‘]

{‘age‘18‘name‘‘zhangqigao‘}

stu: zhangqsan 22

None

三、shelve模块使用

3.1、常用方法


1

2

3

4

5

6

7

8

9

10

11

12

>>> import shelve

>>> d = shelve.open("shelve_test")

>>> dir(d)

[‘_MutableMapping__marker‘‘__abstractmethods__‘‘__class__‘‘__contains__‘‘__del__‘,

 ‘__delattr__‘‘__delitem__‘‘__dict__‘‘__dir__‘‘__doc__‘‘__enter__‘‘__eq__‘‘__exit__‘,

 ‘__format__‘‘__ge__‘‘__getattribute__‘‘__getitem__‘‘__gt__‘‘__hash__‘‘__init__‘,

‘__iter__‘‘__le__‘‘__len__‘‘__lt__‘‘__module__‘‘__ne__‘‘__new__‘‘__reduce__‘,

 ‘__reduce_ex__‘‘__repr__‘‘__setattr__‘‘__setitem__‘‘__sizeof__‘‘__slots__‘‘__str__‘,

 ‘__subclasshook__‘‘__weakref__‘‘_abc_cache‘‘_abc_negative_cache‘,

‘_abc_negative_cache_version‘‘_abc_registry‘‘_protocol‘‘cache‘‘clear‘‘close‘‘dict‘,

 ‘get‘‘items‘‘keyencoding‘‘keys‘‘pop‘‘popitem‘‘setdefault‘‘sync‘‘update‘,

‘values‘‘writeback‘]

 3.2、update

说明:update方法是如果序列化的值存在,则更新,如果不存在,则新增,用法:update({key:序列化对象})


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#dumps到文件中

import shelve

info = {

    "name":"zhangqigao",

    "age":18

}

with shelve.open("shelve_test") as d:

    d[‘qigaotest‘= info   #变量存在

    d.update({‘qigaotest‘:"shuaigaogao"})   #更新已经key为"qigaotest"的值

#loads到内存中

import shelve

with shelve.open("shelve_test") as f:

    print(f.get("qigaotest"))

#输出

shuaigaogao

3.3、get

说明:把文件中的值load到内存中时,通过get它的key值获取


1

2

3

4

5

6

7

import shelve

with shelve.open("shelve_test") as f:

    print(f.get("qigaotest")) #或者是f["qigaotest"]

#输出

shuaigaogao

注意:如果是通过f["qigaotest"]这种方法取,如果值不存在则会报错,通过get去取,不存在,则会返回none

四、总结

  1. shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
  2. shelve模块可以持久化任何pickle可支持的python数据格式。
  3. shelve就是pickle模块的一个封装。
  4. shelve模块是可以多次dump和load。

xml模块

一、简述

  xml是实现不同语言或者程序之间进行数据交换的协议,跟json差不多,但是json使用起来更简单,不过,古时候,在json还没有诞生的黑暗年代,大家只能选择xml,到现在仍然有很多传统的公司,像金融行业的很多系统的接口还是xml。

二、xml格式

1、xml的格式

说明:就是通过<>节点来区别数据结构的,格式如下:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

三、xml节点操作

1、查询xml文档内容


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import xml.etree.ElementTree as et

tree = et.parse("xmltest.xml")

root = tree.getroot()   #获取根节点

print(root.tag)   #打印节点名称

#遍历xml文档

for child in root:

    print(child.tag,child.attrib) #分别打印子节点名称和子节点属性

    #遍历子节点下的所有节点

    for in child:

        print(i.tag,i.text)   #打印子节点下节点的节点名和节点值

    #只遍历year节点

    for in child.iter("year"):

        print("\t",i.tag,i.attrib,i.text)

#只遍历year节点

for node in root.iter("year"):

    print(node.tag,node.text)  #打印year的节点名和节点值

注:

  1. tag是返回节点名,attrib返回节点属性,text返回节点值
  2. 返回根节点用getroot()方法
  3. 只遍历某个节点,只需要用iter(节点名)方法

2、修改xml文档内容


1

2

3

4

5

6

7

8

9

10

11

12

13

import xml.etree.ElementTree as et

tree = et.parse("xmltest.xml")

root = tree.getroot()

#修改year节点的值

for node in root.iter("year"):

    new_year = int(node.text) + 1   #修改节点值

    node.text = str(new_year)    #修改后强制转换成字符串类型

    node.tag = "myyear"            #修改节点名

    node.set("zhangqigao",‘handsome‘)   #修改节点属性

tree.write("xmltest1.xml")   #修改完成后,重新写入xml文件(可以是任何文件,包括原来的)

注:可以修改xml文件中的任何内容,包括本身的节点名,修改后一定要有写入xml文件的操作。

3、删除node节点


1

2

3

4

5

6

7

8

9

10

11

12

import xml.etree.ElementTree as et

tree = et.parse("xmltest.xml")

root = tree.getroot()

#删除

for country in root.findall("country"):  #找到第一层子节点

    rank = int(country.find("rank").text)   #找到子节点下的‘rank‘节点的节点值

    if rank > 50:

        root.remove(country)    #删除子节点

tree.write("xmltest1.xml")    #重新写入xml文件

注:

  1. findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址
  2. find从根节点查找第一层子节点名,返回第一层子节点下的所有节点的内存地址
  3. 删除子节点用remove()方法
  4. 删除以后,一定要做重新写入新的xml文件操作

四、创建新的xml文件

1、手动创建xml文件


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

import xml.etree.ElementTree as et

new_xml = et.Element("namelist")   #创建根节点

#创建第一层子节点,后面参数依次是:父节点,子节点,子节点属性

name = et.SubElement(new_xml,"name",attrib={"zhangqigao":"handsome"})

#创建第二层子节点

age = et.SubElement(name,"age",attrib={"check":"yes"})

#设置第二层节点值

age.text = ‘22‘

sex = et.SubElement(name,"sex")

sex.text = "man"

#创建另外一个第一层子节点

name2 = et.SubElement(new_xml,"name",attrib={"zhangqigao":"haoshuai"})

#创建其第二层子节点

age = et.SubElement(name2,"age")

age.text = ‘19‘

ET = et.ElementTree(new_xml)  #生成新的xml文档

ET.write("test.xml",encoding="utf-8",xml_declaration=True)  #在新xml文件的开头自动添加:<?xml version=‘1.0‘ encoding=‘utf-8‘?>

et.dump(new_xml)  #在屏幕上打印生成的格式

注:et.dump(new_xml)这个有什么作用呢?当你需要直接把字符串传过去,不需要串文件时,用这个就ok了。

configparser模块

一、简述

  在很多情况下,我们都需要修改配置文件,但是,有些配置文件,如mysql数据库的配置文件怎么修改呢?我们今天就来写一下,用于生产和修改常见配置文件的模块:configparser。

二、配置文件格式

1、配置文件格式

[DEFALUT]
compressionlevel = 9
serveraliveinterval = 45
compression = yes
forwardx11 = yes

[bitbucket.org]
user = hg

[topsecret.server.com]
host port = 50022
forwardx11 = no

三、创建配置文件

1、创建配置文件

说明:其实有的时候我们很少创建,除非是用系统管理,一般直接修改就可以了,但是还是要掌握的。

代码如下:

import  configparser   #导入configparser模块

#创建一个对象
config = configparser.ConfigParser()
#配置默认全局配置组
config["DEFALUT"] = {"ServerAliveInterval":"45",
                      "Compression":"yes",
                      "CompressionLevel":"9"
                      }
#配置第一个其他组
config["bitbucket.org"] = {}
#没有没有赋给一个变量,直接赋值
config["bitbucket.org"]["User"] = ‘hg‘

#配置第二个其他组
config["topsecret.server.com"] = {}
#这边就赋给一个变量
topsecret = config["topsecret.server.com"]
#通过变量赋值
topsecret["Host Port"] = ‘50022‘
topsecret["ForwardX11"] = ‘no‘
#给全局配置组赋值
config["DEFALUT"]["ForwardX11"] = "yes"
#操作完毕,把配置的内容写入一个配置文件中
with open("example.ini","w") as configfile:
    config.write(configfile)

四、读取配置文件

1、读取配置组

>>> import  configparser
>>> config = configparser.ConfigParser()
>>> config.sections()    #不读取配置文件,组名列表为空
[]
>>> config.read("example.ini")  #读取配置文件,返回配置文件名
[‘example.ini‘]
>>> config.sections()  #返回除默认配置组的其他组名
[‘bitbucket.org‘, ‘topsecret.server.com‘]
>>> config.defaults()   #读取默认配置组,并返回有序字典
OrderedDict([(‘compressionlevel‘, ‘9‘), (‘serveraliveinterval‘, ‘45‘), (‘compression‘, ‘yes‘), (‘forwardx11‘, ‘yes‘)])

2、组名是否存在

>>> ‘bitbucket.org‘ in config   #组名存在
True
>>> ‘zhangqigao.org‘  in config   #组名不存在
False

3、读取组内的值

>>> config["bitbucket.org"]["User"]  #读取"bitbucket.org"配置组中的值
‘hg‘
>>> config["DEFAULT"]["Compression"]  #读取默认配置组中的值
‘yes‘
>>> topsecret = config[‘topsecret.server.com‘]  #把配置组赋给一个对象
>>> topsecret[‘ForwardX11‘]   #通过对象获取值
‘no

4、 循环获取组内的key值

>>> for key in config["bitbucket.org"]:  #循环打印bitbucket.org组下的key值
...     print(key)
...
#输出,只打印默认组和bitbucket.org组的key值
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> for key in config["topsecret.server.com"]:#循环打印topsecret.server.com组下的key值
...     print(key)
...
#输出,只打印默认组和topsecret.server.com组的key值
host port
forwardx11
compressionlevel
serveraliveinterval
compression

注:默认组是全局的,所以循环遍历key值时,会遍历从默认组和需要遍历的组一起遍历出来。

五、configparser增删改查语法

1、配置文件名i.cfg

[DEFAULT]
k1 = v1
k2 = v2

[section1]
k3 = v3
k4:v4

[section2]
k5 = 5

2、读i.cfg

import configparser

config = configparser.ConfigParser()
config.read("i.cfg")
sec = config.sections()
print(sec)
#输出
[‘section1‘, ‘section2‘]

options = config.options("section2")  #返回默认组和section2组的key值
print(options)
#输出
[‘k5‘, ‘k1‘, ‘k2‘]

item_list = config.items("section2")   #返回默认组和section2组的key-value值
print(item_list)
#输出
[(‘k1‘, ‘v1‘), (‘k2‘, ‘v2‘), (‘k5‘, ‘5‘)]

val1 = config.get("section2","k1")   #获取section2组中k1对应的值,是否可取是按照上面返回的列表
print(val1)
#输出
v1

val2  = config.getint("section2","k5")  #返回section2中k5的值,这个值返回的int类型的
print(val2)
#输出
5

3、改写i.cfg

①删除section和option

import configparser

config = configparser.ConfigParser()

config.read("i.cfg")
config.remove_option("section1","k3")  #删除section1组下的k3
config.remove_section("section2")   #删除section2组
with open("i.cfg2","w") as f:   #重新写入一个文件
    config.write(f)

#输出,写入文件的内容
[DEFAULT]
k1 = v1
k2 = v2

[section1]
k4 = v4

②添加section

import configparser

config = configparser.ConfigParser()
config.read("i.cfg")
sec = config.has_option("section2","k5")  #是否存在section2组内有k5
print(sec)
#输出
True

sec = config.has_section("zhangqigao")  #是否存在zhangqigao组
print(sec)
#输出
False

config.add_section("zhangqigao")  #添加section组zhangqigao

config.add_section("zhangqigao")  #重新写入到一个配置文件中
with open("i.cfg3","w") as f:
    config.write(f)

③添加或者设置option

import configparser

config = configparser.ConfigParser()
config.read("i.cfg")

config.set("zhangqigao","z","18")  #设置或者添加zhangqigao中option值

with open("i.cfg3","w") as f:   #重新写入文件中
    config.write(f)
时间: 2024-10-06 18:07:31

Python函数和常用模块【day06】:shutil-shelve-xml-configparser模块的相关文章

python学习道路(day6note)(time &amp;datetime,random,shutil,shelve,xml处理,configparser,hashlib,logging模块,re正则表达式)

1.tiim模块,因为方法较多我就写在code里面了,后面有注释 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 print("time".center(60,"-")) 5 print(time.asctime()) #返回字符串格式 外国的时间 6 #Fri Nov 18 11:25:08 2016 7 t = time.localtime() #本地时间 8 #print(t) #这是一个对象所以需要 9 p

python模块(shelve,xml,configparser,hashlib,logging)

1.1shelve模块 shelve 模块比pickle模块简单,只有一个open函数,返回类似字典对象,可读可写:key必须为字符串, 而值可以是python所支持的数据类型. shelve模块主要用来存储一个简单的数据, shelve最重要的函数是open,在调用它的时候,使用文件名作为参数,它会返回一个架子(shelf)对象,可以用它来存储类容. 1 f = shelve.open(r"shelve_test.txt") 2 # aa = {"stu1":{&

Python学习第十三天 time datetime random os sysshutil json pickle shelve xml configparser hashlib suprocess logging re

https://www.cnblogs.com/yuanchenqi/articles/5732581.html https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label2 一 time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是fl

模块urllib requests json xml configparser 学习笔记

发起http请求 获取返回值 返回值是字符串 第三方模块安装 pip install requests 返回值格式 xml  html  jaon json 功能  loads   字符串>>>列表 字典 字符串里面必须是"",因为其他的编程语言字符串都是"" dups      列表>>>字符串 xml from xml.etree import ElementTree as ET tree = ET.parse('1.xml'

Python函数和常用模块【day06】:json &amp; pickle-hashlib模块

本节内容 json序列化 pickle序列化 hashlib模块 json序列化 1.dumps序列化和loads反序列化 dumps()序列化 1 2 3 4 5 6 7 8 9 10 11 12 13 import  json   #导入json模块 info = {     'name':"zhangqigao",     "age":22 } with open("test.txt","w") as f:  #以普通模

python函数和常用模块(三),Day5

递归 反射 os模块 sys模块 hashlib加密模块 正则表达式 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. class Foo(object): def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' obj = Foo() # #### 检查

常用模块(json/pickle/shelve/XML)

一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化? 1.持久保持状态 2.跨平台数据的交互 JSON是什么? java script object notation 就是对象表示法 var obj = {"name":"egon"} 对于我们开发而言 j

保存数据到文件的模块(configparser,json,pickle,shelve,xml)_python

一.各模块的主要功能区别 configparser模块:保存字典内容到文件,并按照一定的格式写入文件保存. shelve模块:将对象写入到文件,保存没有格式,较为轻便. json模块:将对象从内存中完成序列化存储,但是不能对函数和类进行序列化,写入的格式是明文. pickle模块:将对象从内存中完成序列化存储,可以能对函数进行序列化,写入的格式是二进制格式. xml模块:不同语言或程序之间数据交换(较少用) 二.各模块使用例子 1.configparser模块 (1)写入文件 import co

用ConfigParser模块读写配置文件——Python

对于功能较多.考虑用户体验的程序,配置功能是必不可少的,如何存储程序的各种配置? 1)可以用全局变量,不过全局变量具有易失性,程序崩溃或者关闭之后配置就没了,再者配置太多,将变量分配到哪里也是需要考虑的问题. 2)用配置文件,通过在程序中读配置文件获取配置,用户改变配置后重新写入配置文件,即使程序崩溃或者关闭,配置依然能够保存下来. 3)用数据库来存储配置变量,也能长久保存,不过读写数据库也是重量级操作,不太方便. 最近在写一个基于wxPython的GUI程序,需要用到配置文件,本来打算用xml