目录:

  1. shutil
  2. logging模块
  3. shelve
  4. configparser
  5. subprocess
  6. xml处理
  7. yaml处理
  8. 自定义模块

一,系统标准模块:

1、shutil:是一种高层次的文件操作工具,类似于高级API,而且主要强大之处在于其对文件的复制与删除操作更是比较支持好,是高级的文件、文件夹、压缩包处理模块,而且是系统的标准自带模块;

copyfile(src, dst, *, follow_symlinks=True):拷贝文件,如果目标存在同名的文件会进行覆盖:

import shutil
file = "test.py"
shutil.copyfile(file,"/tmp/2.sh")

copyfileobj(fsrc, fdst, length=16*1024):将一个文件的文件内容拷贝到另一个文件中,可以指定拷贝部分内容:

import shutil
a = open('test.py','rb')
b = open('new.py','wb')
shutil.copyfileobj(a,b)
a.close()
b.close()

 

shutil.copymode(src, dst):仅拷贝权限。内容、组、用户均不变

import subprocess
subprocess.Popen("ls -l",shell=True) #执行带参数的命令,查看当前目录的文件权限
-rw-r--r--   1 root         root          24 Nov 16 17:12 1
-rw-r--r--   1 root         root   184516354 Nov 26 10:58 10.16.57.102
-rw-r--r--   1 root         root      556763 Nov 26 12:05 all.sq #源文件权限
-rw-------.  1 root         root        2441 Aug 11  2015 anaconda-ks.cfg #目标操作文件现在的权限是600

import shutil #导入模块
shutil.copymode("all.sq","anaconda-ks.cfg") #将all.sq的权限赋值给anaconda-ks.cfg,每个文件的内容都保持不变
subprocess.Popen("ls -l",shell=True)
-rw-r--r--   1 root         root          24 Nov 16 17:12 1
-rw-r--r--   1 root         root   184516354 Nov 26 10:58 10.16.57.102
-rw-r--r--   1 root         root      556763 Nov 26 12:05 all.sq
-rw-r--r--.  1 root         root        2441 Aug 11  2015 anaconda-ks.cfg #文件权限已经更改成和all.sq的一样

 

shutil.copystat(src, dst):拷贝状态的信息,包括:mode bits, atime, mtime, flags

subprocess.Popen("ls -l",shell=True)
-rw-r--r--   1 root         root          24 Nov 16 17:12 1
-rw-r--r--   1 root         root   184516354 Nov 26 10:58 10.16.57.102
-rw-r--r--   1 root         root      556763 Nov 26 12:05 all.sq #源文件时间戳
-rw-r--r--.  1 root         root        2441 Aug 11  2015 anaconda-ks.cfg #目标文件时间戳

shutil.copystat('all.sq','anaconda-ks.cfg')
subprocess.Popen("ls -l",shell=True)
-rw-r--r--   1 root         root          24 Nov 16 17:12 1
-rw-r--r--   1 root         root   184516354 Nov 26 10:58 10.16.57.102
-rw-r--r--   1 root         root      556763 Nov 26 12:05 all.sq 
-rw-r--r--.  1 root         root        2441 Nov 26 12:05 anaconda-ks.cfg #时间信息已经个all.sq保持一致了

 

shutil.copy(src, dst):拷贝文件和权限,即保留文件的源权限:

subprocess.Popen(["touch","mytest.py"]) #创建一个文件
shutil.copy('mytest.py','mytest.py.bak') #从刚才创建的文件复制一个文件
subprocess.Popen("ls -l",shell=True)
-rw-r--r--   1 root         root           0 Mar  4 16:35 mytest.py #复制前的文件
-rw-r--r--   1 root         root           0 Mar  4 16:39 mytest.py.bak #复制后的文件

 

shutil.copy2(src, dst):拷贝文件和状态信息:

shutil.copy2('mytest.py','mytest2.py.bak')
subprocess.Popen("ls -l",shell=True)
-rw-r--r--   1 root         root           0 Mar  4 16:35 mytest2.py.bak #shutil.copy2保留了源文件的权限和状态信息
-rw-r--r--   1 root         root           0 Mar  4 16:35 mytest.py
-rw-r--r--   1 root         root           0 Mar  4 16:39 mytest.py.bak #shutil.copy 保留了源文件的权限但是没有保留状态信息

 

shutil.copytree(src, dst, symlinks=False, ignore=None):递归的去拷贝文件中的所有目录和文件,如copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*') #可以设置忽略不拷贝的文件名后缀

 shutil.copytree("1","1_new") #递归copy1到1_new
subprocess.Popen("tree",shell=True)
 1.doc
 1.exe
 1.log
 1.txt
 234
1_new
 1.doc
 1.exe
 1.log
 1.txt
 234

shutil.rmtree(path[, ignore_errors[, onerror]]):递归删除文件和目录

shutil.rmtree("1_new")

shutil.move(src, dst):递归的去移动文件和目录:

 shutil.move("1","new_1")
mysql.sock
new_1
    1.doc
    1.exe
    1.log
    1.txt
    2
        3
            4

shutil.make_archive(base_name, format,...):

创建压缩包并返回文件路径,例如:"zip", "tar", "bztar""gztar"
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
    如:www                        =>保存至当前路径
    如:/Users/wupeiqi/tom =>保存至/Users/tom/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
shutil.make_archive("etc_back",format="zip",root_dir="/etc/") #完全备份/etc/里面的所有文件和目录,是递归备份

subprocess.Popen("ls -l /tmp/etc_back.zip",shell=True)
<subprocess.Popen at 0x7f555aef8850>

 -rw-r--r-- 1 root root 21316881 Mar  4 17:25 /tmp/etc_back.zip

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,如下:

zipfile:

import zipfile
压缩过程:
zipfile = zipfile.ZipFile("myzip.zip","w") #创建一个实例,并制定新建的压缩文件名和w模式
zipfile.write("my.cnf")
zipfile.write("host.conf")
zipfile.write("fstab")
zipfile.close() #在为关闭之前系统是存在myzip.zip,但是无法解压

subprocess.Popen("ls -l /tmp/myzip.zip",shell=True)
<subprocess.Popen at 0x7f555bedfc90>
 -rw-r--r-- 1 root root 5982 Mar  4 17:34 /tmp/myzip.zip

解压过程:
z = zipfile.ZipFile("/tmp/myzip.zip","r")
z.extractall()
z.close()

TarFile:

# 压缩
mytar = tarfile.open("/tmp/test/my_file.tar","w")
mytar.add("/tmp/1.txt")
mytar.add("/tmp/1.tar") #1.txt和1.tar需要事先存在
mytar.close() 

# 解压
tar = tarfile.open("/tmp/test/my_file.tar","r")
tar.extractall("/tmp/") #解压到/tmp里面
tar.close() #关闭会话

 

2、logging模块:用于自定义日志安全级别日志并写入文件的模块:

import  logging
#类的实例,全局的级别,日志实例
logger =  logging.getLogger('TEST-LOG')
logger.setLevel(logging.DEBUG)

#输出在屏幕的设定的信息级别
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

#写入在文件设定的信息级别
fh = logging.FileHandler("access.log") #定义操作的日志写入文件
fh.setLevel(logging.INFO)

#创建日志格式
formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')

#添加格式到屏幕和文件的方法
ch.setFormatter(formatter)
fh.setFormatter(formatter)

#将文件设置和屏幕设置添加到logger,即和将信息进行输出和写入到文件
logger.addHandler(ch)
logger.addHandler(fh)

#应用
logger.debug("debug message")
logger.info("debug message")
logger.warn("debug message")
logger.error("debug message")
logger.critical("debug message")
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

只有大于当前日志等级的操作才会被记录,即10大于20,那么DEBUG会记录INFO的日志,而INFO不会记录DEBUG的日志
日志等级划分

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-05-20
  • 2021-12-09
  • 2021-08-10
  • 2022-12-23
  • 2021-04-20
猜你喜欢
  • 2022-01-10
  • 2022-12-23
  • 2022-12-23
  • 2021-10-12
  • 2021-05-18
  • 2021-10-18
  • 2022-12-23
相关资源
相似解决方案