Python——模块

shutil 模块

基本概念

  • shutil 可以简单地理解为 sh + utilshell 工具 的意思
  • shutil 模块是对 os 模块的补充,主要针对文件的 拷贝、删除、移动、压缩和解压 操作

shutil 模块的主要方法

复制和移动

shutil.copyfileobj(fsrc, fdst)
  • 将文件的对象 fsrc 的内容复制到文件的对象 fdst

shutil.copyfile(src, dst)

  •     将名为 src 的文件的内容复制到名为 dst 的文件

shutil.copy(src, dst)
  • 将文件 src 复制到文件或目录 dst,包括权限
shutil.move(src, dst)
  • 递归地将文件或目录(src)移动到另一个位置(dst),并返回目标
shutil.copytree(src, dst)
  • 递归地复制以 src 为根的整个目录树,返回目标目录。由 dst 命名的目标目录不能已经存在
shutil.rmtree(path)
  • 删除整个目录树; 路径 必须指向目录, 空目录或者非空目录都可使用

权限管理

shutil.copymode(src, dst)
  • 将权限位从 src 复制到 dst
  • 文件内容,所有者和组不受影响
  • srcdst 是以字符串形式给出的路径名称
shutil.chown(path, user=None, group=None)
  • 更改给定 路径 的所有者 用户
import shutil
#文件的复制与移动
#1.shuti.copyfileobj(源文件管家,目标文件管家)
fr=open("/etc/hosts",mode="r")
fw=open("/opt/myhosts",mode="w")
shutil.copyfileobj(fr,fw)
fr.close()
fw.close()

#2.shutil.copyfile(源文件,目标文件):只能复制内容
shutil.copyfile("/usr/bin/ls","/opt/myls")

#3.shutil.copy(源文件,目标文件):内容权限都复制
shutil.copy("/usr/bin/ls","/opt/myls2")

#目录操作 shtik+os
#1.shutil.copytree(源目录路径,目标目录路径):目录路径不存在
shutil.copytree("","/tmp/NSD2023")
#2.shutil.rmtree(目录路径)
shutil.rmtree("/tmp/NSD2023")

#权限
#1.shutil.copymode(源目录路径,目标目录路径):只复制权限不复制内容
shutil.copymode("/usr/bin/ls","/tmp/myhhosts")
#2.shutil.chown(文件,user="",group=""):
#  useradd cuihua
shutil.chown("/tmp/myhosts",user="cuihua",group="cuihua")

os 模块

  • 对文件系统的访问大多通过 python 的 os 模块实现
  • 该模块是 python 访问操作系统功能的主要接口
  • 有些方法,如:copy 等,并没有提供,可以使用 shutil 模块作为补充
# os模块的常用方法

>>> import os               #导入os系统模块

>>> os.                     #os.<Tab><Tab> 查看os模块的所以方法

>>> os.getcwd()             #getcwd(),查看当前所处的文件路径,类似于: pwd

>>> os.listdir()            #listdir(), 查看当前目录下的所有文件(包括隐藏文件),类似于:ls -a

>>> os.listdir('/tmp')      #listdir('/tmp'), 查看/tmp目录下的内容,类似于:ls /tmp

>>> os.mkdir('/tmp/mytest')     #mkdir(), 创建目录,类似于:mkdir /tmp/mytest

>>> os.mkdir('/tmp/demo/abc')           #只能创建单级目录,父目录无法创建

>>> os.makedirs('/tmp/demo/abc')        #创建目录时,父目录不存在,会自动创建,类似于: mkdir -p ...

>>> os.chdir('/tmp/demo')       #chdir(), 切换当前所处的文件位置,类似于:cd /tmp/demo

>>> os.getcwd()             #getcwd(),查看当前所处的文件路径,类似于: pwd

>>> os.listdir()            #listdir(), 查看当前目录下的所有文件(包括隐藏文件),类似于:ls -a

>>> os.remove('abc')        #remove(), 只能删除单个文件,不能删除目录

>>> os.rmdir('abc')         #rmdir(),只能删除空目录;要删除非空目录要使用shutil.rmtree()

>>> os.rmdir('/var/tmp')        #rmdir(),只能删除空目录;要删除非空目录要使用shutil.rmtree()


>>> os.path.                #查看os.path子模块的所有方法

>>> os.mkdir('abc')         #mkdir(), 在当前路径下,创建一个目录'abc'

>>> os.path.basename('/tmp/demo/abc')       #获取最右边'/',右边的数据‘abc’

>>> os.path.basename('/tmp/demo/abc/')      #basename(),获取最右边'/',右边的数据''

>>> os.path.dirname('/tmp/demo/abc')        #dirname(), 获取最右边'/',左边的数据'/tmp/demo'

>>> os.path.split('/tmp/demo/abc')      #split(), 路径切割,从最右边'/'开始,进行切割

>>> os.path.join('/tmp/demo', 'abc')        #join(), 路径的拼接

>>> os.path.is                      #os.path.is<Tab><Tab>, 列出所有判断的方法

>>> os.path.isabs('tmp/abc/xyz')        #'tmp/abc/xyz'是否是绝对路径,不管文件是否存在,False

>>> os.path.isabs('/tmp/abc/xyz')       #'/tmp/abc/xyz'是否是绝对路径,不管文件是否存在,True

>>> os.path.isdir('/tmp/demo/abc')      # 字符串是否为目录(文件必须存在,且必须是目录) ,True

>>> os.path.isdir('/tmp/demo/xyz')      # 字符串是否为目录(文件必须存在,且必须是目录),False

>>> os.path.isfile('/etc/hosts')        #字符串是否是文件(文件必须存在,且必须是文件),True

>>> os.path.isfile('/etc/')         #字符串是否是文件(文件必须存在,且必须是文件),False

>>> os.path.islink('/etc/grub2.cfg')            #字符串是否是链接文件(文件必须存在,且必须是链接文件),True

>>> os.path.exists('/etc/hostname')         #判断字符串是否存在,/etc/hostname,True

subprocess 模块

基础概念

  • subprocess 模块主要用于执行 系统命令
  • subprocess 模块允许你产生新的进程,并获得它们的返回状态
  • 通俗地说就是通过这个模块,你可以在 Python 的代码里执行操作系统级别的命令,比如 "ifconfig" 、"du -sh" 等等

run 方法

功能:执行 args 参数所表示的命令,等待命令结束,并返回一个 CompletedProcess 类型对象

>>> import subprocess

>>> subprocess.run(['ls'])  # 将命令写到列表中,执行linux命令

>>> subprocess.run(['ls', '/home'])  # 将命令和操作的目录写到列表中,执行linux命令

>>> subprocess.run('ls /home')  # 以字符串形式执行linux命令,无法区分命令和目标文件,错误,会把'ls /home 当做一个整体

>>> subprocess.run('ls /home', shell=True)  # 若想以字符串形式执行,指定shell解释器

通过 shell 执行命令

  • subprocess.run(['ls', '/home']) 这种方式不支持环境变量,不支持命令的扩展,不支持 shell解释器 下执行命令,所以使用字符串的方式执行 linux命令
    >>> subprocess.run('echo $HOME', shell=True)  # 使用run()查看当前用户的家目录,使用shell执行命令
    
    >>> subprocess.run('ls /root', shell=True)

    run 方法返回值

  • run 方法查看上一级目录下的内容,使用 shell 执行命令
>>> subprocess.run('ls ..', shell=True)  # 最后一行为返回值

day01  day02  day03  day04

CompletedProcess(args='ls ..', returncode=0)


# run方法查看上一级目录下的内容,赋值给变量result

>>> result = subprocess.run('ls ..', shell=True)

day01  day02  day03  day04


# 查看变量result的值,为run()的返回值

>>> result

CompletedProcess(args='ls ..', returncode=0)


# 查看result中args列表的内容,为linux命令

>>> result.args

'ls ..'


# 查看result中returncode的值,为0;returncode 为状态码

# 上一条命令执行成功,结果为0;反之,结果为非零值

>>> result.returncode

'0'

注意

  • subprocess 模块虽然可以支持所有的 linux 命令,但不可乱用,放弃其他的模块
  • subprocess 模块编写的代码,不具有跨平台性,不能在 windows,mac 等系统使用

案例:练习

 调用 ping 命令
#         编写 ping 函数
#         用于测试远程主机的联通性
#         ping 通显示:x.x.x.x:up
#         ping 不通显示:x.x.x.x:down

def ping(n):
    data = subprocess.run(f"ping -c 2 {n} &> /dev/null", shell=True)
    if data.returncode == 0:
        print(n, ":up")
    else:
        print(n, ":down")


if __name__ == '__main__':
    ping("127.0.0.1")
# 总结:变量和字符串的拼接f{},%s %()
#     print(data)#CompletedProcess(args='ls /opt', returncode=0)   returncode==$? 用data.returncod

综合案例:

#创建用户
#并且给每一个用户一个8位密码
#并将用户信息写到文件中(/tmp/user.txt)
# def useradd():
#     1.id用户名,如果执行成功则用户名存在不可创建,否则可以创建
#     2.echo 密码 | passwd --stdin 用户名
#     3.追加用户信息到指定文件中


import random,subprocess
from string import ascii_letters,digits
def get_pwd(n=8):
    pwd = ''
    for i in range(n):
        tmp=random.choice(ascii_letters+digits)
        pwd +=tmp
    return pwd
def useradd(user,pwd):
    subprocess.run(f"useradd {user}",shell=True)
    data=subprocess.run(f"id {user} &> /dev/null",shell=True)
    if data.returncode!=0 :
        subprocess.run(f"echo {pwd} | passwd --stdin {user}",shell=True)
        with open("/tmp/user1.txt",mode="a") as fa :
            fa.write(f"{user}:\t{pwd}\n")
    else:
        print("用户已经存在")

if __name__ == '__main__':
    user_list=[f"user{i}" for i in range(1,11)]
    pwd = get_pwd()
    for user in user_list:
        useradd(user,pwd)

用户前面能前入后面就写不了进去了

异常

什么是异常

程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常

异常是因为程序出现了错误,而在正常控制流以外采取的行为

  • 这个行为又分为两个阶段:

    • 首先是引起异常发生的错误
    • 然后是检测(和采取可能的措施)阶段

try :
    n1=int(input("n1:"))
    n2=int(input("n2:"))
    data = n1/n2
    #except 错误类型 as 变量: 变量指向报错信息冒号右边的内容
except ValueError :
    print("请输入整数")
except ZeroDivisionError as e:
    print("reason:",e)
except (KeyboardInterrupt , EOFError):
    print("byebye~")
    exit() #退出程序
except Exception as e:
    print("reason:",e)
else :
    print("data:",data)
finally:
    print("finally ok~")
print("ok~")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值