python的文件操作模块shutil和pathlib总结

一:shutil模块

1,shutil模块安装

pip insatll shutilwhich

2,shutil支持的方法

可以通过dir(shutil)查看shutil支持的方法和属性

['Error', 'ExecError', 'ReadError', 'RegistryError', 'SameFileError', 'SpecialFileError', '_ARCHIVE_FORMATS', '_BZ2_SUPPORTED', 
'_LZMA_SUPPORTED', '_UNPACK_FORMATS', '_ZLIB_SUPPORTED', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
 '__loader__', '__name__', '__package__', '__spec__', '_basename', '_check_unpack_options', '_copyxattr', '_destinsrc', '_ensure_directory', 
 '_find_unpack_format', '_get_gid', '_get_uid', '_make_tarball', '_make_zipfile', '_ntuple_diskusage', '_rmtree_safe_fd',
 '_rmtree_unsafe', '_samefile', '_unpack_tarfile', '_unpack_zipfile', '_use_fd_functions', 'chown', 'collections', 'copy', 
 'copy2', 'copyfile', 'copyfileobj', 'copymode', 'copystat', 'copytree', 'disk_usage', 'errno', 'fnmatch', 'get_archive_formats', 'get_terminal_size', 
 'get_unpack_formats', 'getgrnam', 'getpwnam', 'ignore_patterns', 'make_archive', 'move', 'nt', 'os', 
 'register_archive_format', 'register_unpack_format', 'rmtree', 'stat', 'sys', 'unpack_archive', 'unregister_archive_format', 'unregister_unpack_format', 'which']

3,shutil方法举例

1>文件拷贝copy,copy2

这两个方法都可以拷贝文件,但是有什么不同?

 你可以理解为copy2拷贝的更彻底

shutil.copy('http.pcap','test/')
shutil.copy2('http.pcap','test/')

将http.pcap文件拷贝到test的文件夹下

 

 上边是copy的结果,下边是copy2的结果,可以看到下边的文件时间信息都拷贝过来了

2>文件删除rmtree

 递归删除一个文件夹,连同文件夹本身会删除

shutil.rmtree('test')

 需要注意的是传入的path参数必须是一个文件夹,如果是文件的话就会报错

>>> shutil.rmtree('1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/shutil.py", line 239, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "/usr/lib64/python2.7/shutil.py", line 237, in rmtree
    names = os.listdir(path)
OSError: [Errno 20] Not a directory: '1'

所以用这个命令前最好加一个判断

os.path.isdir(path)

 3>文件(夹)移动move

 递归移动一个文件或者文件夹

shutil.move('scrdir','dstdir')

移动前,dstdir是一个空目录,scrdir是一个目录里面有目录有文件

移动后

 

 需要注意的是如果目的是一个已经存在的文件,则可能会覆盖

4>文件夹压缩make_archive

shutil.make_archive('ftz','zip','dstdir')

 5>文件解压缩unpack_archive

二:pathlib模块

         pathlib是跨平台的、面向对象的路径操作模块,可适用于不同的操作系统,其操作对象是各种操作系统中使用的路径(包括绝对路径和相对路径),pathlib有两个主要的类,分别为PurePath和Path。

PurePath

PurePath访问实际文件系统的“纯路径”,只负责对路径字符串执行操作。PurePath有两个子类,即PurePosixPath和PathWindowsPath,前者用于操作UNIX(包括 Mac OS X)风格的路径,后者用于操作Windows风格的路径。

Path

Path访问实际文件系统的“真正路径”,Path对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。有两个子类,即PosixPath和WindowsPath,前者用于操作UNIX(包括 Mac OS X)风格的路径,后者用于操作Windows风格的路径。

PurePath和Path的区别

Path 是 PurePath 的子类,除了支持 PurePath 的各种操作、属性和方法之外,还会真正访问底层的文件系统,包括判断 Path 对应的路径是否存在,获取 Path 对应路径的各种属性(如是否只读、是文件还是文件夹等),甚至可以对文件进行读写。

PurePath 和 Path 最根本的区别在于,PurePath 处理的仅是字符串,而 Path 则会真正访问底层的文件路径,因此它提供了属性和方法来访问底层的文件系统。

UNIX 和 Windows 风格路径区别

UNIX 风格的路径和 Windows 风格路径的主要区别在于根路径和路径分隔符,UNIX 风格路径的根路径是斜杠(/),而 Windows 风格路径的根路径是盘符(c:);UNIX 风格的路径的分隔符是斜杠(/),而 Windows 风格路径的分隔符是反斜杠(\)。

注意:

考虑到操作系统的不同,在使用 PurePath 类时,如果在 UNIX 或 Mac OS X 系统上使用 PurePath 创建对象,该类的构造方法实际返回的是 PurePosixPath 对象;反之,如果在 Windows 系统上使用 PurePath 创建对象,该类的构造方法返回的是 PureWindowsPath 对象。

考虑到操作系统的不同,Path 类的使用同 PurePath 类。

pathlib和os常用操作对比

通过常用路径操作的对比,可以更深刻理解pathlib和os的区别,便于在实际操作中做对照,也便于进行使用替代,详细对比如下:

pathlib操作os及os.path操作功能描述
Path.resolve()os.path.abspath()获得绝对路径
Path.chmod()os.chmod()修改文件权限和时间戳
Path.mkdir()os.mkdir()创建目录
Path.rename()os.rename()文件或文件夹重命名,如果路径不同,会移动并重新命名
Path.replace()os.replace()文件或文件夹重命名,如果路径不同,会移动并重新命名,如果存在,则破坏现有目标。
Path.rmdir()os.rmdir()删除目录
Path.unlink()os.remove()删除一个文件
Path.unlink()os.unlink()删除一个文件
Path.cwd()os.getcwd()获得当前工作目录
Path.exists()os.path.exists()判断是否存在文件或目录name
Path.home()os.path.expanduser()返回电脑的用户目录
Path.is_dir()os.path.isdir()检验给出的路径是一个文件
Path.is_file()os.path.isfile()检验给出的路径是一个目录
Path.is_symlink()os.path.islink()检验给出的路径是一个符号链接
Path.stat()os.stat()获得文件属性
PurePath.is_absolute()os.path.isabs()判断是否为绝对路径
PurePath.joinpath()os.path.join()连接目录与文件名或目录
PurePath.nameos.path.basename()返回文件名
PurePath.parentos.path.dirname()返回文件路径
Path.samefile()os.path.samefile()判断两个路径是否相同
PurePath.suffixos.path.splitext()分离文件名和扩展名

PurePath 类属性和方法汇总

Path 类属性和方法汇总

 

重点介绍下文件查找

  • Path.iterdir(),查找文件夹下的所有文件,返回的是一个生成器类型;
  • Path.glob(pattern),查找文件夹下所有与 pattern 匹配的文件,返回的是一个生成器类型;
  • Path.rglob(pattern),查找文件夹下所有子文件夹中与 pattern 匹配的文件,返回的是一个生成器类型。

 

iterdir方法

from pathlib import *

input_path = r"C:\Users\okmfj\Desktop\MTool工具"

# 获取文件夹下所有文件,返回文件路径(字符)列表,采用iterdir方法
[str(f) for f in Path(x).iterdir() if Path(f).is_file()]

# 获取文件夹下所有文件类型,返回文件后缀的列表,采用iterdir方法
list(set([Path(f).suffix for f in Path(x).iterdir() if Path(f).is_file()]))
# 结果: ['.pdf', '.txt', '.docx']

glob方法

from pathlib import *

input_path = r"C:\Users\okmfj\Desktop\MTool工具"

# 获取文件夹下所有文件,返回文件路径(字符)列表,采用glog方法
[str(f) for f in Path(input_path).glob(f"*.*") if Path(f).is_file()]

# 获取文件夹下所有文件,返回文件路径(字符)列表,采用glog方法
[str(f) for f in Path(input_path).glob(f"**\*.*") if Path(f).is_file()]

# 获取文件夹下所有文件类型,返回文件后缀的列表,采用glog方法
list(set([Path(f).suffix for f in Path(input_path).glob(f"*.*") if Path(f).is_file()]))
# 结果: ['.pdf', '.txt', '.docx']

# 获取文件夹下(含子文件)所有文件类型,返回文件后缀的列表,采用glog方法
list(set([Path(f).suffix for f in Path(x).glob(f"**\*.*") if Path(f).is_file()]))
# 结果: ['.pdf', '.txt', '.docx']

rglob方法

from pathlib import *

input_path = r"C:\Users\okmfj\Desktop\MTool工具"

# 获取文件夹下(含子文件)所有文件,返回文件路径(字符)列表,采用rglog方法
[str(f) for f in Path(x).rglob(f"*.*") if Path(f).is_file()]

# 获取文件夹下(含子文件)所有文件类型,返回文件后缀的列表,采用rglog方法
list(set([Path(f).suffix for f in Path(x).rglob(f"*.*") if Path(f).is_file()]))
# 结果: ['.pdf', '.txt', '.docx']

更加详细的信息可以参考:Python路径操作模块pathlib,看这篇就够了! - 知乎 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ftzchina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值