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
请输入信息正确脚本执行完毕