python中的shutil模块
Python的Shutil模块可以看做是OS模块的补充,它提供了对文件(夹)复制,移动,删除,压缩和解压缩的方法。
一、文件复制
1. shutil.copy(src, dst)
src为源文件路径(必须是文件),dst为目标文件路径(文件名可加可不加)
目标文件如存在会覆盖掉,不存在会创建新文件,包括路径
只copy内容,其他文件属性如时间,权限没有copy
返回值为目标文件路径
>>> shutil.copy('../class.py','./') #复制文件到当前目录,注意dst为目标路径 './class.py' >>> os.listdir('./') #列出当前目录的文件名信息,class.py已创建 ['test3', 'class.py', 'test2', 'function.py', 'function1.py', 'test1'] >>> shutil.copy('../class.py','./class2.py') #复制文件并重命名,注意dst为文件名 './class2.py' >>> os.listdir('./') #列出当前目录的文件名信息,class2.py已创建 ['test3', 'class.py', 'test2', 'function.py', 'class2.py', 'function1.py', 'test1']
2. shutil.copyfile(src, dst)
src为源文件路径(必须是文件),dst为目标文件路径,且必须包含文件名
目标路径不存在会报错
返回值为目标文件路径
>>> shutil.copyfile('../class.py','./class2.py') #用copyfile复制文件 './class2.py' >>> shutil.copyfile('../class.py','./os/class2.py') #目标文件的目录不存在会报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: FileNotFoundError: [Errno 2] No such file or directory: './os/class2.py' >>> shutil.copyfile('../class.py','./') #dst不是文件而是目录会报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: IsADirectoryError: [Errno 21] Is a directory: './'
3. shutil.copy2(src, dst)
src为源文件路径,dst为目标文件路径
同时复制源文件的内容和stat信息(包含用户,组,权限,时间信息等)
返回值为目标文件路径
shutil.copy2()和shutil.copy()的用法很类似,不同点是shutil.copy2()不仅copy了源文件内容,同时copy了源文件的文件属性,包括修改/访问时间(创建时间貌似无法复制),权限等信息。shutil.copy2()相同于同时做了shutil.copy()和shutil.copystat(),因此该方法名字这里的copy2可以简单记忆成2次copy。
>>> shutil.copy('../class.py','./class2.py') #用copy来复制文件 './class2.py' >>> time.ctime(os.stat('../class.py').st_mtime) #返回源文件修改时间 'Sat Jun 8 17:30:32 2019' >>> time.ctime(os.stat('./class2.py').st_mtime) #返回目标文件修改时间,和源文件不一样 'Sun Sep 18 10:20:36 2022' >>> shutil.copy2('../class.py','./class3.py') #用copy2来复制文件 './class3.py' >>> time.ctime(os.stat('./class3.py').st_mtime) #返回目标文件修改时间,和源文件一样 'Sat Jun 8 17:30:32 2019'
4. shutil.copyfileobj(fsrc, fdst,[length=*])
fsrc为源文件句柄,fdst为目标文件句柄,length为copy内容大小
源文件和目标文件必须是已经打开的文件句柄
没有返回值
shutil.copyfileobj()方法可以copy一个打开的文件到另一个打开的文件,注意源文件和目标文件参数均是文件句柄对象。
>>> file1=open('hr.py','r') #打开源文件 >>> file2=open('hr1.py','w') #打开目标文件 >>> shutil.copyfileobj(file1,file2) #文件复制,注意没有返回值
5. shutil.copymode(src, dst)
src为源文件路径,dst为目标文件路径,可以是文件或者目录
目标文件必须已经存在,只复制权限信息,不复制内容,时间,用户和组等信息
返回值为目标文件路径
shutil.copymode()只会复制文件权限(st_mode信息),不会复制内容和其他属性。
>>> os.system('chmod 777 ../class.py') #用shell指令将源文件的读写属性改变 0 >>> os.system('ls -l ../class.py') #打印源文件的属性为-rwxrwxrwx -rwxrwxrwx 1 user user 527 6月 8 2019 ../class.py 0 >>> shutil.copyfile('../class.py','./class4.py') #用copyfile来复制文件 './class4.py' >>> os.system('ls -l ./class4.py') #打印目标文件属性为-rw-r--r--,和源文件不一样 -rw-r--r-- 1 user user 527 9月 18 10:40 ./class4.py 0 >>> shutil.copymode('../class.py','./class4.py')#用copymode来复制文件权限 >>> os.system('ls -l ./class4.py') #打印目标文件属性为-rwxrwxrwx,和源文件一样 -rwxrwxrwx 1 user user 527 9月 18 10:40 ./class4.py 0
6. shutil.copystat(src, dst)
src为源文件路径,dst为目标文件路径,可以是文件或者目录
目标文件必须已经存在,只复制stat信息,包含权限,时间,组,用户等,不复制内容
返回值为目标文件路径
shutil.copystat()相比shutil.mode(),同样也不复制内容,不同的是它除了复制权限信息,其他stat信息包括修改时间等也按同样复制。
>>> shutil.copyfile('../class.py','./class5.py') #复制文件 './class5.py' >>> os.system('ls -l ../class.py') #打印源文件信息 -rwxrwxrwx 1 user user 527 6月 8 2019 ../class.py 0 >>> os.system('ls -l ./class5.py') #打印目标文件信息,权限和时间和源文件不一样 -rw-r--r-- 1 user user 527 9月 18 10:48 ./class5.py 0 >>> shutil.copystat('../class.py','./class5.py') #复制文件stat到目标文件 >>> os.system('ls -l ./class5.py') #打印目标文件信息,权限和时间和源文件一样 -rwxrwxrwx 1 user user 527 6月 8 2019 ./class5.py 0
7. shutil.copytree(src, dst,ignore=none,copy_function=shutil.copy2)
src为源路径,dst为目标路径,目标路径必须不存在 ignore必须是一个可调用对象,shutil.copytree()每次递归访问文件夹时,会将当前目录和目录的os.listdir()作为参数调用一次ignore,该可调用对象必须返回一个相对于当前目录的目录和文件 名序列(即其第二个参数的子集);随后这些名称将在拷贝进程中被忽略。如ignore=shutil.ignore_patterns('*.py'),代表以.py结尾的文件或者文件夹都不会复制。 copy_function可以选择shutil.copy2或者shutil.copy模式进行copy,默认是shutil.copy2 返回值为目标文件路径
shutil.copytree()会递归复制以src为根起点的整个目录树到名为dst的目录并返回目标目录,注意src必须是目录,dst必须不能已存在。如果复制过程中需要忽略某些文件可以使用ignore参数,注意ignore后面需要接可调用对象,该对象可以是一个自定义的函数,函数的参数有2个,当前目录,和当前目录的os.listdir(),函数返回的是需要ignore的文件名。该函数也可以用shutil自带的shutil.ignore_patterns('*patterns')。
>>> shutil.copytree('/home/user/Python','/home/user/Python1',ignore=None,copy_function=shutil.copy) '/home/user/Python1' >>> os.listdir('/home/cfzhu/Python1') #列出copy后的文件夹中的文件 ['dictionary.py', 'abnormal.py', 'aa.json', '.file.py.swp', '.print.py.swp', 'hello.py', 'class.py', 'input.py', 'function.py', 'shutil', '.abnormal.py.swo', 'os', 'file.py', 'file2', 'print.py', 'file1', '__pycache__', 'import.py', '.abnormal.py.swp', 'file3', 'hr.py', 'tk.py', 'aa1.json'] >>> shutil.copytree('/home/user/Python','/home/user/Python2',ignore=shutil.ignore_patterns('*.py'),copy_function=shutil.copy2) '/home/user/Python2' >>> os.listdir('/home/user/Python2') #copy后的文件名没有"*py"结尾的文件 ['aa.json', '.file.py.swp', '.print.py.swp', 'shutil', '.abnormal.py.swo', 'os', 'file2', 'file1', '__pycache__', '.abnormal.py.swp', 'file3', 'aa1.json']
二、文件移动和删除
1. shutil.move(src,dst)
src为源文件路径,dst为目标文件路径,两者都可以是文件或者目录
返回值为目标文件路径
>>> shutil.move('hr.py','hr1.py') #移动文件 'hr1.py' >>> shutil.move('./shutil','./shutil1') #移动文件夹 './shutil1'
2. shutil.rmtree(src)
src为源文件路径
没有返回值
shutil模块中的rmtree()可以递归彻底删除非空文件夹,需要慎重使用
>>> os.listdir() ['.bashrc', 'Python2', '.cache', 'Python1', 'hr_py'] >>> shutil.rmtree('./Python2/') #递归删除文件夹的所有内容 >>> os.listdir() #文件夹已删除 [.bashrc', '.cache', 'Python1', 'hr_py']
三、文件压缩和解压缩
1. shutil.make_archive(base_name,format,dir)
base_name为源文件路径 format为压缩格式,可以是"zip", "tar", "gztar","bztar", or "xztar" dir为压缩后的文件路径 返回压缩后文件路径
shutil.make_archive()可以将文件或者文件夹进行压缩,压缩格式可选,注意压缩源文件并不会删除源文件。
>>> os.listdir() ['shutil1', 'hr2.py', 'function.py'] >>> shutil.make_archive('./shutil1','zip','./') #压缩文件为zip格式 '/home/cfzhu/Python/shutil1.zip'
2. shutil.unpack_archive(filename,extract_dir=None, format=None)
filename为源文件路径 extract_dir为提取后的路径,默认当前路径 format为压缩格式,可以是"zip", "tar", "gztar","bztar", or "xztar",不指定默认为根据源文件后缀 返回压缩后文件路径
shutil.unpack_archive()可以将压缩文件解压缩
>>> shutil.unpack_archive('./shutil1.zip','./shutil2') #解压缩 >>> os.listdir() ['shutil1', 'dictionary.py', 'shutil2', 'abnormal.py', 'aa.json', '.file.py.swp', '.print.py.swp', 'shutil1.zip', ]
转自:https://blog.csdn.net/qq_21337539/article/details/126813197