系统模块,异常处理

shutil
主要提供的是对文件做拷贝的命令
 1. 复制和移动
 1.1 shutil模块  提供对文件做拷贝  移动  删除  等操作    
 copyfileobj() 需要自己打开文件
   格式  shutil.copyfileobj(f1,f2)    
(源文件,目标文件)                                注意目标文件要以w 方式打开                            源文件的内容和属性会被同时复制
 ● shutil.copyfileobj
>>> import shutil
>>> f1 = open('/etc/passwd','rt')
>>> f2 = open('/root/a.txt','wt')
>>> import shutil
>>> shutil.copyfileobj(f1,f2)
>>> f1.close()
>>> f2.close()         #关闭打开的文件后 复制才算完成
[root@localhost ~]# wc -l a.txt 
23 a.txt
[root@localhost ~]# wc -l /etc/passwd
23 /etc/passwd


 ● shutil.copyfile('源文件','新文件')与copyfileobj功能一样  只是不需要自己打开文件.
>>> import shutil
>>>shutil.copyfile("/etc/passwd","/root/b.txt")
'/root/b.txt'
>>>
[root@localhost ~]# wc -l  /root/b.txt 
23 /root/b.txt

 ● shutil.copy('源文件','新文件')复制文件的内容及权限
>>> shutil.copy('/etc/shadow','/root/e.txt')
'/root/e.txt'
>>> 

 ● shutil.copy2('源文件','新文件')复制文件的内容及文件的所有状态信息
>>> shutil.copy2('/etc/hosts','/root/f2.txt')
'/root/f2.txt'
>>> 

 ● shutil.move('源文件','新文件') 移动
>>> shutil.move('/code/a2.txt' , '/root/a22.txt')
'/root/a22.txt'
>>> 

[root@localhost ~]# mkdir -p /c1/c2/c3
>>> shutil.move('/c1','/opt/')
'/opt/c1'
>>> 

 2. 目录操作
 ● shutil.copytree('源目录','新目录')递归复制(包括文件的状态信息)就是复制目录,目标不能有同名目录。
[root@localhost ~]# mkdir -p /a/b/c

>>> shutil.copytree('/a','/a1')
'/a1'
>>>

]# ls /a1

 ● shutil.rmtree('源目录','新目录')(目录或文件)  递归删除
>>> shutil.rmtree('/a')

 3.权限管理
 ● shutil.copymode('源文件','新文件')复制文件权限 不更改文件内容 组 和用户 (复制文件的权限)新文件必须要存在。

[root@teacher code]# ls a2.txt 
a2.txt
[root@teacher code]# ls -l a2.txt 
-rw-r--r-- 1 root root 183 6月  22 09:14 a2.txt
[root@teacher code]# chmod 000 a2.txt
[root@teacher code]# echo "abc" > a2.txt
[root@teacher code]# cat a2.txt 
abc
[root@teacher code]# ls -l a2.txt 
---------- 1 root root 4 6月  22 09:28 a2.txt
[root@teacher code]# ls -l a.txt 
-rw-r--r-- 1 root root 183 6月  22 09:11 a.txt
[root@teacher code]# useradd yzs
[root@teacher code]# chown yzs:yzs a2.txt
[root@teacher code]# ls -l a2.txt 
---------- 1 yzs yzs 4 6月  22 09:28 a2.txt
[root@teacher code]# 
[root@teacher code]# ls a.txt -l
-rw-r--r-- 1 root root 183 6月  22 09:11 a.txt
[root@teacher code]#

>>> shutil.copymode("/code/a.txt" , "/code/a2.txt")

[root@teacher code]# cat /code/a2.txt 
abc
[root@teacher code]# 
[root@teacher code]# ls -l /code/a2.txt 
-rw-r--r-- 1 yzs yzs 4 6月  22 09:28 /code/a2.txt
[root@teacher code]# copymode

 ● shutil.copystat('源文件','新文件')将权限位,最后访问时间,上次修改时间和标志从源文件复制到新文件。
[root@teacher code]# ls -l /etc/shadow
---------- 1 root root 1505 6月  22 09:28 /etc/shadow
[root@teacher code]# 

[root@teacher code]# ls -l /code/a2.txt 
-rw-r--r-- 1 yzs yzs 4 6月  22 09:28 /code/a2.txt
[root@teacher code]#

>>> shutil.copystat("/etc/shadow" , "/code/a2.txt")

[root@teacher code]# cat /code/a2.txt 
abc
[root@teacher code]# ls -l /code/a2.txt 
---------- 1 yzs yzs 4 6月  22 09:28 /code/a2.txt

 ● shutil.chown 更改给定路径的所有者用户和组
[root@teacher code]# id yzs
uid=1005(yzs) gid=1005(yzs) 组=1005(yzs)
[root@teacher code]# ls /code/a.txt
/code/a.txt
[root@teacher code]# ls /code/a.txt -l
-rw-r--r-- 1 root root 183 6月  22 09:11 /code/a.txt
[root@teacher code]# 
>>> shutil.chown('/code/a.txt' ,"yzs","yzs")

[root@teacher code]# ls /code/a.txt -l
-rw-r--r-- 1 yzs yzs 183 6月  22 09:11 /code/a.txt

OS模块 

>>> import  os
>>> os.getcwd()  # 返回当前的工作路径,pwd
'/root/桌面/py02/day03_code'

>>> os.mkdir('/tmp/nsd2012')   # mkdir /tmp/nsd2012

>>> os.makedirs('/tmp/nsd2012/a/b/c')  # mkdir -p /tmp/nsd2012/a/b/c

>>> os.listdir()  # ls
['mygames.py', '.idea', 'mynote.txt', 'python.log', 'mynote2.txt', '03_file_seek.py', '04_myprog.py', '05_cp.py', '01_read_text_file_by_string.py', '02_read_text_file_by_bytes.py']


>>> os.listdir('/tmp')  # ls /tmp  # 列出所有的文件夹
[ 'nsd2012', 'dir1', 'dir2']

>>> os.chdir('/tmp/nsd2012')  # cd  /tmp/nsd2012

>>> os.getcwd()   # pwd
'/tmp/nsd2012'

>>> os.symlink('/etc/passwd', '/tmp/abc')  # ln -s /etc/passwd /tmp/abc
>>> os.mknod('/tmp/myfile.txt')    # touch /tmp/myfile.txt

>>> os.chmod('/tmp/myfile.txt', 0o755)  # chmod 755 /tmp/myfile.txt

修改文件名
>>> import subprocess
>>> subprocess.run('ls code',shell=True)
10.py   2.py    4.py  adduser1.py  cfb.py  game.py    login.py
1.py    3.1.py  5.py  adduser.py   cf.py   je.py      __pycache__
2-1.py  3.py    6.py  a.py         cp.py   jsq.py
2-2.py  4.1.py  7.py  a.txt        fb.py   login2.py
CompletedProcess(args='ls code', returncode=0)
>>> import os
>>> os.rename('code/4.py','code/test.py')
>>> subprocess.run('ls code/test.py',shell=True)
code/test.py
CompletedProcess(args='ls code/test.py', returncode=0)
删除文件
>>> os.rmdir('/tmp/dir2')
CompletedProcess(args='ls code', returncode=0)
>>> os.remove('code/a.txt')
>>> subprocess.run('ls code',shell=True)
CompletedProcess(args='ls code', returncode=0)

OS扩展
os.path
是否是绝对路径(' / '开始)isabs
 os.path.isabs('/root/abc.txt') 
目标对象是否为文件夹         isdir
>>> os.path.isdir('/tmp/nsd2012')  
判断是否为文件                   isfile
>>> os.path.isfile('/tmp/b.txt')    
True
 创建空文件                         mknod(os.mknod)
判断是否为软连接                islink                  (os.symlink创建软连接)
 >>> os.path.islink('/tmp/abc')      
True
是否挂载点                          ismount
>>> os.path.ismount('/home')      
True
文件是否存在                       exists
>>> os.path.exists('/root')      
True
返回文件名                          basename 
>>> os.path.basename('/tmp/nsd2012/hello.py') 
'hello.py'
返回路径                              dirname
>>> os.path.dirname('/tmp/nsd2012/hello.py') 
'/tmp/nsd2012'
>>> os.path.dirname('/etc/passwd')
'/etc'
拆分路径                              split
>>> os.path.split('/etc/passwd')
('/etc', 'passwd')
>>> x,y=os.path.split('/etc/passwd')
>>> print(x)
/etc
>>> print(y)
passwd
拼接路径                              join
>>> os.path.join('/etc','hosts')
'/etc/hosts'
>>> a = os.path.join('/etc','hosts')
>>> print(a)
/etc/hosts

3、pickle模块
存储任何Python对象,可以完整的取出来
打开文件函数 open()<==> file()(Python2制支持,Python3不支持)
dump()存储数据
>>> import pickle as p
>>> f_name = "code/f.txt"
>>> f = open(f_name,'wb')
>>> L = ["A","N","O"]
>>> p.dump(L,f)
>>> f.close()
>>> import subprocess
>>> subprocess.run('ls code/f.txt',shell=True)
code/f.txt
CompletedProcess(args='ls code/f.txt', returncode=0)

load   ()把文件数据读出来
>>> f_name
'code/f.txt'
>>> f = open(f_name,'rb')
>>> data = p.load(f)
>>> print(data)
['A', 'N', 'O']

异常处理
导致脚本无法正常运行的错误输出

基本格式
1,try:
   ....... 有可能出现异常代码
except:
   .........有异常时要执行代码

[root@dc code]# vim 2.1.py  异常处理前
#try:
    foo()
    print(name)
    print("hahaha")
#except:
    print("error!!!")

print("okokokok!!!")
[root@dc code]# python3 2.1.py
  File "2.1.py", line 2
    foo()
    ^
IndentationError: unexpected indent
[root@dc code]# vim 2.1.py  异常处理后
try:
    foo()
    print(name)
    print("hahaha")
except:
    print("error!!!")

print("okokokok!!!")
[root@dc code]# python3 2.1.py
error!!!
okokokok!!!

2,try:
   ....... 有可能出现异常代码
except:         指定异常类型:
   .........有异常时要执行代码

[root@dc code]# vim 2.1.py   前
try:
   #name='jreey'
    print(name)
    print("hahaha")
except NameError as x:
    print("error!!!")

print("okokokok!!!")
[root@dc code]# python3 2.1.py
error!!!
okokokok!!!
[root@dc code]# vim 2.1.py   后
try:
    name='jreey'
    print(name)
    print("hahaha")
except NameError as x:
    print("error!!!")

print("okokokok!!!")
[root@dc code]# python3 2.1.py
jreey
hahaha
okokokok!!!
3,try:
   ....... 有可能出现异常代码
except       指定异常类型  as  变量名:
   .........有异常时要执行代码
except       指定异常类型  as  变量名:

[root@dc code]# vim 2.1.py  后
try:
    print("hahaha")
    L=list("abc")
    print(L[3])
except NameError as x:
    print(x)
except IndexError as y:
    print(y)

print("okokokok!!!")
[root@dc code]# python3 2.1.py
hahaha
list index out of range
okokokok!!!
[root@dc code]# vim 2.1.py 前
try:
    print("hahaha")
    L=list("abc")
    #print(L[3])
except NameError as x:
    print(x)
except IndexError as y:
    print(y)

print("okokokok!!!")
[root@dc code]# python3 2.1.py
hahaha
okokokok!!!

4,try:
   ....... 有可能出现异常代码
except ( 错误名1,错误名2):
   .........有异常时要执行代码

[root@dc code]# vim 2.1.py
try:
    print("hahaha")
    L=list("abc")
    print(L[3])
except (NameError,IndexError) as error:
    print("程序有错,请检查",error)

print("okokokok!!!")
[root@dc code]# python3 2.1.py
hahaha
程序有错,请检查 list index out of range
okokokok!!!

使用内置错误信息类,匹配所有错误类型
try:
   ....... 有可能出现异常代码
except Exception as 变量名 :
   .........有异常时要执行代码

[root@dc code]# vim 2.1.py
try:
    #foo()
    #print(gender)
    #print("hahaha")
    L=list("abc")
    print(L[3])
except Exception as error:
    print(error)

print("okokokok!!!")
[root@dc code]# python3 2.1.py
list index out of range
okokokok!!!

5. else 程序正确,输出代码
try:
   ....... 有可能出现异常代码
except Exception as 变量名:
   .........有异常时要执行代码
esle:
      没有异常输出执行代码

[root@dc code]# vim 2.1.py
try:
    #foo()
    #print(gender)
    #print("hahaha")
    L=list("abc")
    print(L[1])
    #print(L[3])
except Exception as error:
    print(error)
else:
    print("程序正确")

print("okokokok!!!")
[root@dc code]# python3 2.1.py
b
程序正确
okokokok!!!

6.finally 不管是否有异常,都要执行的代码
try:
   ....... 有可能出现异常代码
except Exception as 变量名:
   .........有异常时要执行代码
esle:
      没有异常输出执行代码
finally
         必须执行

[root@dc code]# vim 2.1.py
try:
    #foo()
    #print(gender)
    #print("hahaha")
    L=list("abc")
    print(L[1])
    #print(L[3])
except Exception as error:
    print(error)
else:
    print("程序正确")
finally:
    print("code over")

print("okokokok!!!")
[root@dc code]# python3 2.1.py
b
程序正确
code over
okokokok!!!

7.触发异常 raise(自定义异常)
[root@dc code]# vim q.py
def set_age(name,age):
     if not 0 < age < 120:
          raise ValueError("age out of range .")
     print("%s is %s years old" %(name,age))
if __name__ == '__main__':
      try:
          set_age('bob',25)
      except ValueError:
             print("重新执行脚本输入正确的数值")
      else:
             print("请输入信息正确脚本执行完毕")
[root@dc code]# python3 q.py
bob is 25 years old
请输入信息正确脚本执行完毕

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值