一、random随机数模块

使用随机数模块需要导入随机数模块import random

1.random.random()

生成[0,1)之间的随机小数

2.random.randint(a,b)

生成[a,b]之间的随机整数

3.random.randrange(a,b[,c])

生成[a,b)之间的随机整数,要求a<b,如果有参数c则步长为c

4.random.uniform(a,b)

生成[a,b]之间的随机小数,a和b之间没有大小要求

5.random.choice(序列)

在序列中随机选取一个元素,参数为一个序列,可以为字符串、列表或元组

6.random.sample(序列,n)

在序列中随机选取n个,第一个参数为一个序列,第二个参数表示从序列中选取的个数

7.random.shuffle(l)

打乱列表的元素顺序,参数为一个列表

random.choice(序列)和random.sample(序列,n)都不修改原序列,返回随机选取出来的值

random.shuffle(l)会直接修改列表,返回值为None,如果要查看修改后的列表不能直接打印即不能print(random.shuffle(l)),而是直接打印列表

import random
print(random.random())
print(random.randint(1,5))
print(random.randrange(2,26[,3]))
print(random.choice([1,'hi',[1,2]]))
print(random.sample([1,'hi',[1,2]],2))
print(random.uniform(5,3.6))
a=[1,'a',2,3,'b']
random.shuffle(a)
print(a)

二、shutil文件操作模块

参考https://www.cnblogs.com/xiangsikai/p/7787101.html

os模块提供了对目录或者文件的新建、删除、查看文件属性,还提供了对文件以及目录的路径操作,比如说绝对路径、父目录……  但是文件的操作还应该包含移动、复制、打包、压缩、解压等操作,这些功能os模块没有提供。而shutil模块则是对文件操作的补充,即移动、复制、打包、压缩、解压等操作,需导入模块import shutil。

1.文件操作

①只拷贝文件内容:shutil.copyfileobj(fsrc, fdst[, length]),相当于用原文件的内容覆盖目标文件的内容

f1=open('a.ini','r')
f2=open('b.ini','w')
shutil.copyfileobj(f1,f2)

原文件要以读的模式打开,目标文件要以写的模式打开

②拷贝文件:shutil.copyfile(src, dst),相当于创建一个空的目标文件,再把原文件内容覆盖到目标文件

shutil.copyfile('a.ini','b.ini')

copyfile不需要打开文件。

③拷贝权限:shutil.copymode(src, dst)

shutil.copymode('a.ini','b.ini')

要求目标文件存在。

④拷贝状态信息:shutil.copystat(src, dst),包括创建、访问和修改时间等

shutil.copystat('a.ini','b.ini')

⑤拷贝文件和权限:shutil.copy(src, dst),即先copyfile再copymode

shutil.copy('a.ini','b.ini')

⑥拷贝文件和状态:shutil.copy2(src, dst),即先copyfile再copystat

shutil.copy2('a.ini','b.ini')

⑦移动文件:shutil.move(源文件,指定路径),相当于复制到一个指定路径下并重命名

shutil.move('a.ini','/test/b.ini')

2.目录操作

①shutil.copytree(源目录,目标目录),递归复制目录及目录下的文件,状态信息也一并复制了

shutil.copytree('test/','test_copy/')
shutil.copytree('test/','test_copy/',shutil.ignore_patterns('*.txt','tmp*'))

copytree加参数shutil.ignore_patterns ('模式')表示忽略符合该条件的文件,即选择性复制

②shutil.rmtree(目标目录):递归删除目录及目录下的文件

shutil.rmtree('test/')

3.打包与压缩

①make_archive(base_name, format, root_dir=' ', base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None)  打包、压缩

整个语句的返回值为压缩或打包后的文件的路径+文件名称(文件名称带有相应格式的后缀)

base_name:压缩、打包后的文件名称,无路径则表示当前路径,如果要保存至指定路径则需要指定路径,此处的文件名称不需加格式后缀,打包或压缩完成后会自动加上

format:压缩或打包的格式,有tar、zip、bztar、gztar等

root_dir:打包时切换到的根路径。也就是说开始打包前,会先执行路径切换,切换到root_dir所指定的路径,默认值为当前路径

base_dir:开始打包的路径。也就是说对base_dir所指定的路径进行打包,默认值为 root_dir

owner和group:创建tar包时使用,默认为用户当前的用户和组

logger: 用于记录日志,通常是logging.Logger对象,可省略

#当前/root目录下,要将/root/tmp/test/目录打包并以gztar格式进行压缩,压缩后名称为test_bak,放置在test相同目录下
import shutil
re=shutil.make_archive('/root/tmp/test_bak','gztar','/root/tmp/test/')
print(re)
#执行结果
/root/tmp/test_bak.tar.gz #上述语句执行前
ls /root/tmp/test/test|grep test*
test
#上述语句执行后
ls /root/tmp/test/test|grep test*
test test.tar.gz

make_archive打包与压缩

②shutil.unpack_archive(file_name,unpack_path) 解压缩

file_name:需要解包的文件,需要写上文件后缀名

unpack_path :解包后文件存放的位置

(参考 https://www.jb51.net/article/135049.htm 感谢)

三、zipfile、tarfile的用法

先占个位置,后续再实际操作和补充

参考 https://www.cnblogs.com/MnCu8261/p/5494807.html

四、json、pickle、shelve数据类型转换模块

1.json模块

用于文件处理时其他数据类型与json字符串之间转换。在将其他数据类型转换为json字符串时(dump方法),首先将前者内部所有的单引号变为双引号,再整体加上引号(单或双)转换为json字符串;再使用时再将json字符串还原为本来的数据(load方法)。

json有两对方法json.dumps()和json.loads(),json.dump()和json.load()。

但是dump和load不是必须同时使用,只要字符串满足json规则(引号全部为双引号),可以直接使用load读取。

(在html前端,JSON.stringify(v)可将其他格式数据转化为json字符串,JSON.parse(str)可将json字符串还原为原格式)

import json
l=[1,'hello',{'name':'Alex'}]
with open('new.txt','w') as f:
l_str=json.dumps(l) #将列表l转换为js字符串
f.write(l_str) #将字符串写入文本
print(l_str, type(l_str)) #输出[1,"hello", {"name": "Alex"}] <class 'str'>,可以看见原列表中所有的单引号全部变成了双引号,并且整体类型为字符串 with open('new.txt','r') as f:
l=f.read()
print(l,json.loads(l),type(json.loads(l))) #输出[1,"hello", {"name": "Alex"}] [1,'hello', {'name': 'Alex'}] <class 'list'>

json模块使用

上述最后一行可以看见,由于写入时为json字符串,直接读取时也为json字符串,即引号全部为双引号,而json.loads()是将dump处理过的字符串变成了原来的列表,并且处理过的双引号全部变回了单引号。

在上述文件中,转换和写操作l_str=json.dumps(l)和f.write(l_str)可以用一步json.dump(l,f)代替

在上述文件中,读和转换操作l=f.read()和json.loads(l)可以用一步json.load(f)代替

2.pickle模块

pickle的用法类似于json,不同的是json是将其它数据类型与字符串进行转换,而pickle是将其它数据类型与字节进行转换。由于是与字节进行转换,所以打开文件时需要以b的方式。

通过pickle把变量从内存中变成可存储或可传输的过程称之为序列化,反之,把变量内容从序列化的对象重新读取到内存里称之为反序列化。

import pickle
l=[1,'hello']
with open('c.txt','wb') as f:
pickle.dump(l,f) with open('c.txt','rb') as f:
print(pickle.load(f))

pickle模块使用

3.shelve模块

shelve是通过键值对,即字典的形式去存储数据的,键必须为字符串,值可以为任何python数据类型。

shelve只有open和close方法,open的时候参数为文件名,执行之后会生成后缀分别为dat、bak、dir的三个文件。

import shelve
s=shelve.open('test') #参数为文件名,执行之后会生成test.dat、test.bak、test.dir,此时s相当于一个空字典
s['one']=12 #通过字典的方式给赋值
s['two']={'name':'Alice','age':19}
s['three']=[1,'hello']
s.close()
s=shelve.open('test')
print(s['one']) #输出12
print(s['two']['age']) #输出19
s['one']=20 #直接通过字典的方式修改值
s.close()

shelve模块使用

五、hashlib加密模块

hashlib模块对文件或字符串进行加密处理,加密过程不可逆。常用方法有md5()和sha256(),其余还有sha1()、sha224()、sha384()、sha512()等方法。

以md5()的使用为例讲解用法

import hashlib
h=hashlib.md5()
h.update('admin'.encode('utf8')) #将admin通过utf8编码为字节,再进行加密
print(h.hexdigest()) #获取加密后的字符串

上述单纯的加密算法很容易被暴力破解,为防止此情况发生,可在加密时加入“杂质”,即在hashlib.md5()中加入参数作为杂质

import hashlib
h=hashlib.md5('hello'.encode('utf8')) #加入杂质hello
h.update('admin'.encode('utf8'))
print(h.hexdigest())

需要注意的是,下面这个例子,先对admin加密,再对root加密,最后的结果实际是对admin和root的拼接、即adminroot做的加密

import hashlib
h=hashlib.md5()
h.update('admin'.encode('utf8'))
print(h.hexdigest())
h.update('root'.encode('utf8'))
print(h.hexdigest()) #4b3626865dc6d5cfe1c60b855e68634a

可进行验证

import hashlib
h=hashlib.md5()
h.update('root'.encode('utf8'))
print(h.hexdigest()) #63a9f0ea7bb98050796b649e85481845
import hashlib
h=hashlib.md5()
h.update('adminroot'.encode('utf8'))
print(h.hexdigest()) #4b3626865dc6d5cfe1c60b855e68634a

六、logging日志模块

logging模块中日志分为五个级别,分别是debug、info、warning、error、critical,默认级别为warning。

通过logging.basicConfig设置日志的显示参数,再通过logging.debug等方法输出日志,这种方法要么只能输出日志到屏幕,要么只能输出日志到一个文件中,无法同时输出到屏幕和文件。

import logging
logging.basicConfig(
level=logging.WARNING, #设置级别为WARN级别,默认就为WARNING级别
filename='log.log', #设置日志输出到脚本所在路径下的log.log文件,默认输出到当前屏幕
filemode='w', #默认为写模式,默认为追加模式
format='%(asctime)s %(filename)s[%(lineno)d] %(message)s' #日志格式
)
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message') #输出文件如下
#2018-11-21 10:22:14,183 log.py[10] warning message
#2018-11-21 10:22:14,183 log.py[11] error message
#2018-11-21 10:22:14,184 log.py[12] critical message

以上,在logging.basicConfig的format中可设置日志显示的各种参数

%(asctime)s:以字符串形式显示当前时间,默认格式为2018-11-20 21:06:04,862

%(name)s:登录用户

%(pathname)s:调用日志输出函数的模块的完整路径

%(filename)s:调用日志输出函数的模块的文件名

%(module)s:调用日志输出函数的模块名

%(funcName)s:调用日志输出函数的函数名

%(lineno)d:调用日志输出函数的语句所在代码行

%(process)d:进程id

%(thread)d:线程id

%(threadName)s:线程名

%(levelno)s:数字形式的日志级别

%(levelname)s:文本形式的日志级别

%(created)f:当前时间,用unix标准的表示时间的浮点数表示

%(relativeCreated)d:输出日志信息时的、自logger创建以来的毫秒数

通过logging.getLogger()方法生成对象并设置各种参数,再调用对象的debug等方法显示日志

def logger():  #定义文件
logger=logging.getLogger() #创建一个logger对象,默认为根用户
fh=logging.FileHandler('test_log') #创建向文件输出日志的对象,参数为目标文件的名称
sh=logging.StreamHandler() #创建向屏幕输出日志的对象
fm=logging.Formatter('%(asctime)s %(name)s %(message)s') #创建格式对象
fh.setFormatter(fm) #设置向文件输出日志的对象的格式
sh.setFormatter(fm) #设置向屏幕输出日志的对象的格式
logger.addHandler(fh) #logger对象增加向文件输出日志的功能
logger.addHandler(sh) #logger对象增加向屏幕输出日志的功能
logger.setLevel('DEBUG') #设置logger对象的日志显示级别
return logger logger = logger()
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')

logger=logging.getLogger()默认创建的是根用户的对象,如果加参数例如‘test’,表示创建的是根用户下的test用户,如果再要创建test下的子用户,需加通过.加参数例如'test.son',且如果参数相同,则创建的多个对象都是同一个对象,对其设置的格式、日志等级等,都以最后一个为准。

如果创建根用户对象和根用户的子对象,或者一个对象和它的子对象,则子对象的日志会输出两遍,即子对象有几层父对象,它的日志就会输出几遍。

logger=logging.getLogger('phh')
logger1 = logging.getLogger('phh.girl')
fh=logging.FileHandler('test_log')
sh=logging.StreamHandler()
fm=logging.Formatter('%(asctime)s %(name)s %(message)s')
fh.setFormatter(fm)
sh.setFormatter(fm)
logger.addHandler(fh)
logger.addHandler(sh)
logger1.addHandler(sh)
logger.setLevel('WARNING')
logger1.setLevel('ERROR') logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
logger1.debug('1 debug message')
logger1.info('1 info message')
logger1.warning('1 warning message')
logger1.error('1 error message')
logger1.critical('1 critical message')
#输出内容如下
# 2018-11-21 21:03:51,999 phh warning message
# 2018-11-21 21:03:51,999 phh error message
# 2018-11-21 21:03:51,999 phh critical message
# 2018-11-21 21:03:52,000 phh.girl 1 error message
# 2018-11-21 21:03:52,000 phh.girl 1 error message
# 2018-11-21 21:03:52,000 phh.girl 1 critical message
# 2018-11-21 21:03:52,000 phh.girl 1 critical message

七、paramiko远程登录模块

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作。

如果python服务器对被远程控制机器开启了免密验证,即在python服务器上可通过ssh 用户名@被控制机器ip 登录被远程控制机器而不用输入密码,那么可以获取python服务器的私钥并通过私钥进行连接,如果没有开启免密验证则通过密码进行连接。

1.开启免密验证

#执行命令
import paramiko
#获取本机私钥
private_key=paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
#实例化SSHClient
ssh = paramiko.SSHClient()
#自动添加策略,保存python服务器的主机名和密钥信息
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接被远程控制机器
ssh.connect('被控制机器ip', 端口号, '登录用户名', private_key[,timeout=n])
#打开一个channel并执行命令
stdin, stdout, stderr = ssh.exec_command('command')
#打印执行结果
print(stdout.read())
#关闭SSHClient
ssh.close()

远程执行命令

#上传文件
import paramiko
#获取本机私钥
private_key=paramiko.RSAKey.from_private_key_file(/root/.ssh/id_rsa)
#获取Transport实例
t=paramiko.Transport('被控制机器ip',端口号))
#连接SSH服务端
t.connect('登录用户名',private_key)
#获取sftp实例
sftp = paramiko.SFTPClient.from_transport(t)
#上传文件
sftp.put('log.log','/tmp/log.log')
#关闭sftp连接
t.close() #下载文件
import paramiko
#获取本机私钥
private_key=paramiko.RSAKey.from_private_key_file(/root/.ssh/id_rsa)
#获取Transport实例
t=paramiko.Transport('被控制机器ip',端口号))
#连接SSH服务端
t.connect('登录用户名',private_key)
#获取sftp实例
sftp = paramiko.SFTPClient.from_transport(t)
#下载文件
sftp.get('/tmp/log.log', 'log3.log')
#关闭sftp连接
t.close()

上传和下载文件

2.未开启免密验证

#执行命令
import paramiko
#实例化SSHClient
ssh = paramiko.SSHClient()
#自动添加策略,保存python服务器的主机名和密钥信息
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接被远程控制机器
ssh.connect('被控制机器ip', 端口号, '登录用户名', '登录密码'[,timeout=n])
#打开一个channel并执行命令
stdin, stdout, stderr = ssh.exec_command('command')
#打印执行结果
print(stdout.read())
#关闭SSHClient
ssh.close()

远程执行命令

#上传文件
import paramiko#获取Transport实例
t=paramiko.Transport('被控制机器ip',端口号))
#连接SSH服务端
t.connect('登录用户名','登录密码')
#获取sftp实例
sftp = paramiko.SFTPClient.from_transport(t)
#上传文件
sftp.put('log.log','/tmp/log.log')
#关闭sftp连接
t.close() #下载文件
import paramiko#获取Transport实例
t=paramiko.Transport('被控制机器ip',端口号))
#连接SSH服务端
t.connect('登录用户名','登录密码')
#获取sftp实例
sftp = paramiko.SFTPClient.from_transport(t)
#下载文件
sftp.get('/tmp/log.log', 'log3.log')
#关闭sftp连接
t.close()

上传和下载文件

八、subprocess模块

若指定了shell=True,可同时执行多个命令,命令之间用分号隔开。

1.subprocess.run()

执行命令,将结果和命令打印至屏幕。不加shell=True参数,则将命令作为列表传递,添加shell=True参数则直接传递命令。

>>> import subprocess
>>> subprocess.run(['ls','-l'])
total 16
-rw-r--r-- 1 root root 115 Nov 17 14:36 a.py
-rw-r--r-- 1 root root 27 Nov 17 14:23 argv.py
drwxr-xr-x 2 root root 4096 Nov 17 19:59 __pycache__
-rw-r--r-- 1 root root 238 Nov 17 19:59 shelve.py
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run('ls -l',shell=True)
total 16
-rw-r--r-- 1 root root 115 Nov 17 14:36 a.py
-rw-r--r-- 1 root root 27 Nov 17 14:23 argv.py
drwxr-xr-x 2 root root 4096 Nov 17 19:59 __pycache__
-rw-r--r-- 1 root root 238 Nov 17 19:59 shelve.py
CompletedProcess(args='ls -l', returncode=0)

subprocess.run()

2.subprocess.call()

执行命令,将结果和状态码打印至屏幕,正确执行则状态码为0否则非0。

>>> res = subprocess.call('ls -l',shell=True)
total 16
-rw-r--r-- 1 root root 115 Nov 17 14:36 a.py
-rw-r--r-- 1 root root 27 Nov 17 14:23 argv.py
drwxr-xr-x 2 root root 4096 Nov 17 19:59 __pycache__
-rw-r--r-- 1 root root 238 Nov 17 19:59 shelve.py
>>> res
0
>>> subprocess.call('ls -l',shell=True)
total 16
-rw-r--r-- 1 root root 115 Nov 17 14:36 a.py
-rw-r--r-- 1 root root 27 Nov 17 14:23 argv.py
drwxr-xr-x 2 root root 4096 Nov 17 19:59 __pycache__
-rw-r--r-- 1 root root 238 Nov 17 19:59 shelve.py
0
>>> subprocess.call('la',shell=True)
/bin/sh: la: command not found
127

subprocess.call()

3.subprocess.check_call()

执行命令,正确执行则将结果和状态码打印至屏幕(与call一样),错误则抛出异常。

>>> subprocess.check_call('ls -l',shell=True)
total 16
-rw-r--r-- 1 root root 115 Nov 17 14:36 a.py
-rw-r--r-- 1 root root 27 Nov 17 14:23 argv.py
drwxr-xr-x 2 root root 4096 Nov 17 19:59 __pycache__
-rw-r--r-- 1 root root 238 Nov 17 19:59 shelve.py
0
>>> subprocess.check_call('la',shell=True)
/bin/sh: la: command not found
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/python3.7/lib/python3.7/subprocess.py", line 328, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'la' returned non-zero exit status 127.

subprocess.check_call()

4.subprocess.getstatusoutput()

接收字符串形式的命令,返回一个元组,元组的第一个元素为执行状态码,第二个元素位置为执行结果。

>>> subprocess.getstatusoutput('pwd')
(0, '/root/test')
>>> a = subprocess.getstatusoutput('ls')
>>> a
(0, 'a.py\nargv.py\n__pycache__\nshelve.py')

subprocess.getstatusoutput()

5.subprocess.getoutput()

接收字符串形式的命令,执行命令并获取返回结果

>>> subprocess.getoutput('ls')
'a.py\nargv.py\n__pycache__\nshelve.py'
>>> a = subprocess.getoutput('pwd')
>>> a
'/root/test'

subprocess.getoutput()

6.subprocess.check_output()

执行命令,以字节形式返回结果。

>>> subprocess.check_output("pwd")
b'/root/test\n'

subprocess.check_output()

7.subprocess.Popen()

①stdout和stderr,标准输出和标准错误,需要通过read读出,读出的结果为字节。

>>> subprocess.Popen('ls -l',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
<subprocess.Popen object at 0x7fb7b24eb550>
>>> res = subprocess.Popen('ls -l',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.stdout.read()
b'total 16\n-rw-r--r-- 1 root root 115 Nov 17 14:36 a.py\n-rw-r--r-- 1 root root 27 Nov 17 14:23 argv.py\ndrwxr-xr-x 2 root root 4096 Nov 17 19:59 __pycache__\n-rw-r--r-- 1 root root 238 Nov 17 19:59 shelve.py\n'
>>> res = subprocess.Popen('la',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.stderr.read()
b'/bin/sh: la: command not found\n'
>>> res.stdout.read()
b''

标准输出和标准错误

②poll(),检查命令是否执行完成,未执行完成返回None,完成返回0

>>> res = subprocess.Popen('sleep 10;ls -l',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> print(res.poll())
None
>>> print(res.poll())
None
>>> print(res.poll()) #10s之前结果一直为None,10s之后返回0
0

poll()

③wait(),挂起直到命令执行完成,并返回执行状态

>>> res = subprocess.Popen('sleep 10;ls -l',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.wait() #等待状态,此时不接收其他命令,10s后返回状态0即执行完毕
0

wait()

④terminate(),终止执行

>>> res = subprocess.Popen('sleep 10;ls -l',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.terminate()
>>> res.stdout.read()
b''

terminate()

⑤pid,当前子shell进程的pid

>>> res = subprocess.Popen('ls -l',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.pid
9394

pid

九、configparser生成配置文件模块

1.基本用法

import configparser
config = configparser.ConfigParser() #相当于生成了一个空字典config{} config["DEFAULT"] = {'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': ''} #使用字典的方式给config赋值 config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg' config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '' # mutates the parser
topsecret['ForwardX11'] = 'no' # same here with open('example.ini', 'w') as f:
config.write(f) #将删除内容写入文件 #生成文件的内容如下
#[DEFAULT]
#serveraliveinterval = 45
#compression = yes
#compressionlevel = 9 #[bitbucket.org]
#user = hg #[topsecret.server.com]
#host port = 50022
#forwardx11 = no

configparser基本用法

在以块为单位取块的值时,DEFAULT块都会出现。

2.获取块名

通过config.sections()可获取除了DEFAULT之外的块名,返回结果为一个列表

config.read('example.ini')  #读取文件
print(config.sections()) #config.sections()返回一个列表['bitbucket.org', 'topsecret.server.com'],包含除了DEFAULT之外的块名,需要事先读取文件
print(config['bitbucket.org']['user']) #使用字典的方式取值
print(config['DEFAULT']['compression'])

获取块名

3.遍历块

当遍历除了DEFAULT之外的某一个块时,DEFAULT的内容也会被显示

for i in config['bitbucket.org']:
print(i)
#输出结果如下
# user
# serveraliveinterval
# compression
# compressionlevel

遍历块

4.获取块的键和值

通过config.options()和config.items()获取块的键和键值对,通过config.get('块名','键')获取键对应的值

print(config.options('bitbucket.org'))
print(config.items('bitbucket.org'))
print(config.get('bitbucket.org','user'))
#输出内容如下
# ['user', 'serveraliveinterval', 'compression', 'compressionlevel']
# [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('user', 'hg')]
# hg

获取块的键和值

5.增加块

增加块config.add_section('块名')、增加块中的键值对config.set('块名','键','值')

config.read('example.ini')  #先读取文件
config.add_section('hello') #增加块hello,已经存在的块会报错
config.set('hello','type','python') #增加块hello的键值对
config.write(open('example.ini','w')) #将增加操作写入文件

增加块

6.删除块

删除块config.remove_section('块名')、删除块中的键值对config.remove_option('块名','键')

config.read('example.ini')
config.remove_section('bitbucket.org') #删除块
config.remove_option('hello','type') #删除块下面的键值对
config.write(open('example.ini','w'))

删除块

十、xml模块

xml是实现不同语言或程序之间数据交换的协议,类似json,比json出现得更早。

如下一个名为xml_test的文件,下面的操作都对这个文件进行

<date>和</date>、<country>和</country>、<year>和</year>等成对出现的为非闭合标签,而<neighbor>是自闭合标签,自闭合标签没有值也没有子标签。

<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank> #rank为标签tag,update为标签的属性attribute,yes为属性的值,2为标签的值text
<year>2010</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2013</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2013</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>

xml文件示例

导入xml模块并获取根节点

import xml.etree.ElementTree as ET  #导入模块名称较长时可以取别名
tree = ET.parse("xml_lesson") #获取根节点
root = tree.getroot() #获取根节点标签
print(root.tag)

遍历整个文档

for child in root:
print(child.tag, child.attrib) #获取子节点标签、属性
for i in child:
print(i.tag, i.attrb, i.text) #获取子节点的子节点的标签、属性和值

只遍历year节点

for node in root.iter('year'):
print(node.tag, node.text)

修改year节点

for node in root.iter('year'):
new_year = int(node.text) + 1 #将year节点的值转换为int,再加1
node.text = str(new_year) #将上述计算得到新的值转换为字符串重新赋给year节点的值
node.set("updated", "yes") #给year节点增加属性update,属性值为yes
tree.write("xml_test") #将上述修改和增加写入文档,此处可写入一个新的文档,也可写入原文档

删除指定节点

for country in root.findall('country'):  #查找root下的所有country节点
rank = int(country.find('rank').text) #查找country节点下的rank节点,并获取rank节点的值
if rank > 50:
root.remove(country) #如果节点的值大于50,则删除整个country节点
tree.write('output.xml') #将上述操作写入文档

通过python语句生成xml文档

import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist") #生成名为new_xml的文档,根节点标签为namelist
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"}) #生成new_xml的子节点,子节点标签为name,属性为enrolled,属性值为yes
age = ET.SubElement(name, "age", attrib={"checked": "no"}) #生成name的子节点,标签为age,属性为checked,属性值为no
sex = ET.SubElement(name, "sex") #生成name的子节点,标签为sex
sex.text = '' #set标签的值为‘33’
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = ''
et = ET.ElementTree(new_xml) # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True)
ET.dump(new_xml) # 打印生成的格式

通过上述命令生成的new_xml文件的内容如下

<namelist>
<name enrolled='yes'>
<age checked='no'>
<sex>33</sex>
</name>
<name enrolled='no'>
<age>19</age>
</name>
</namelist>

python的常用模块的更多相关文章

  1. python的常用模块之collections模块

    python的常用模块之collections模块 python全栈开发,模块,collections 认识模块 什么是模块?    常见的场景:一个模块就是一个包含了python定义和声明的文件,文 ...

  2. python之常用模块

    python 常用模块 之 (subprocess模块.logging模块.re模块) python 常用模块 之 (序列化模块.XML模块.configparse模块.hashlib模块) pyth ...

  3. python之常用模块二(hashlib logging configparser)

    摘要:hashlib ***** logging ***** configparser * 一.hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法 ...

  4. Python学习——python的常用模块

    模块:用一堆代码实现了某个功能的代码集合,模块是不带 .py 扩展的另外一个 Python 文件的文件名. 一.time & datetime模块 import time import dat ...

  5. python 之常用模块

    一 认识模块 二 常用模块    (1)re模块    (2)collections模块 一  认识模块     (1)什么是模块      (2)模块的导入和使用 (1)模块是:一个模块就是一个包含 ...

  6. Python之常用模块--collections模块

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  7. Python自动化开发之python的常用模块

    python常用模块 模块的种类:模块分为三种,分别是自定义模块:内置标准模块(即标准库):开源模块(第三方). 以下主要研究标准模块即标准库:标准库直接导入即可,不需要安装. 时间模块:time , ...

  8. python基础----常用模块

    一 time模块(时间模块)★★★★                                                      时间表现形式 在Python中,通常有这三种方式来表示时 ...

  9. python(五)常用模块学习

    版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明. https://blog.csdn.net/fgf00/article/details/52357 ...

  10. python学习——常用模块

    在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...

随机推荐

  1. JavaScript基础对象创建模式之链式调用模式(Chaining Pattern)(029)

    链式调用模式允许一个接一个地调用对象的方法.这种模式不考虑保存函数的返回值,所以整个调用可以在同一行内完成: myobj.method1("hello").method2().me ...

  2. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

  3. 小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了

    这里涉及到一个关键词:策略模式,那么到底什么是策略模式呢?本文就来好好给大家讲讲策略模式,大家可以带着如下几个问题来阅读本文:   1. 如何通过策略模式优化业务逻辑代码(可以根据自己从事的工作思考) ...

  4. npm和webpack

    npm是前端开发中常用的一种工具,对于普通开发者来说,便于管理依赖. 往大了说,便于共享代码.写完代码,使用npm发布以后,然后别人用npm可以方便地共享到你的代码. npm的使用: mac环境下的安 ...

  5. directive 实例讲解

    http://my.oschina.net/ilivebox/blog/289670 gulp-nodemon http://www.zhihu.com/question/32123388?sort= ...

  6. MySQL实验 子查询优化双参数limit

    MySQL实验 子查询优化双参数limit 没想到双参数limit还有优化的余地,为了亲眼见到,今天来亲自实验一下.   实验准备 使用MySQL官方的大数据库employees进行实验,导入该示例库 ...

  7. hbase2.1.9 centos7 完全分布式 搭建随记

    hbase2.1.9 centos7 完全分布式 搭建随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭配其他博 ...

  8. unity position 记录

    localPosition为自身矩形中心点(Pivot)与其父节点矩形中心点(Pivot)的相对位置坐标,与自身锚点(Anchors)无关.anchoredPosition为矩形中心点(Pivot)与 ...

  9. java 数据结构(九):Collection子接口:List接口

    1. 存储的数据特点:存储序的.可重复的数据. 2. 常用方法:(记住)增:add(Object obj)删:remove(int index) / remove(Object obj)改:set(i ...

  10. java 面向对象(二十一):属性的赋值顺序

    * ①默认初始化 * ②显式初始化/⑤在代码块中赋值 * ③构造器中初始化 * ④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值 * * ...