翼度科技»论坛 编程开发 python 查看内容

Python内置库:pathlib(文件路径操作)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
官方文档: pathlib — Object-oriented filesystem paths
一、基础使用


  • 遍历子目录
  • 使用通配符遍历文件
  • 拼接路径
  • 获取标准化后的绝对路径
  • 查询路径常规属性
  • 打开文件
  1. from pathlib import Path
  2. print('1.1 查询指定目录的子目录')
  3. p = Path('D:/Envs')
  4. print([sub_p for sub_p in p.iterdir() if sub_p.is_dir()])
  5. print('1.2 使用通配符查询目录中的某类文件')
  6. p = Path('D:/Envs/flask_env/Scripts')
  7. # glob的结果是一个生成器,需要使用list进行转换
  8. print(list(p.glob('*.bat')))
  9. print('1.3 拼接路径,以下三种方式都可以')
  10. p = Path('D:/Envs')
  11. p = p / 'flask_env'
  12. print(p)
  13. p = p.joinpath('Scripts')
  14. print(p)
  15. p = p.joinpath(Path('activate.bat'))
  16. print(p)
  17. print('1.4 获取绝对路径,会自动消除符号链接使之称为一个标准化的路径表示,Windows中,斜杠会被转换为反斜杠')
  18. p = Path('.')
  19. print(p.resolve())
  20. print('1.5 查询路径常规属性')
  21. p = Path('D:/Envs')
  22. print(p.exists())
  23. print(p.is_dir())
  24. print(p.is_file())
  25. print('1.6 打开文件,以下两种方式都可以')
  26. p = Path('./test.txt')
  27. with open(p) as f:
  28.     print(f.read())
  29. with p.open() as f:
  30.     print(f.read())
复制代码
  1. 1.1 查询指定目录的子目录
  2. [WindowsPath('D:/Envs/django_env'), WindowsPath('D:/Envs/flask_env'), WindowsPath('D:/Envs/study')]
  3. 1.2 使用通配符查询目录中的某类文件
  4. [WindowsPath('D:/Envs/flask_env/Scripts/activate.bat'), WindowsPath('D:/Envs/flask_env/Scripts/deactivate.bat')]
  5. 1.3 拼接路径,以下三种方式都可以
  6. D:\Envs\flask_env
  7. D:\Envs\flask_env\Scripts
  8. D:\Envs\flask_env\Scripts\activate.bat
  9. 1.4 获取绝对路径,会自动消除符号链接使之成为一个标准化的路径表示,Windows中,斜杠会被转换为反斜杠
  10. D:\Projects\pathlib_test
  11. 1.5 查询路径常规属性
  12. True
  13. True
  14. False
  15. 1.6 打开文件,以下两种方式都可以
  16. This is a test file
  17. This is a test file
复制代码
二、Pure paths

Pure paths在不对文件系统进行实际操作的前提下,提供了各种操作路径的方法。该模块提供了三个类PurePath、PureWindowsPath、PurePosixPath,从名称可以看出PureWindowsPath用于Windows系统,PurePosixPath用于非Windows系统,当然也可以直接使用基类PurePath,从类定义上看,PureWindowsPath和PurePosixPath只是在 _flavour 上提前定义好了操作系统类型,直接使用PurePath会根据 os.name 自动识别当前操作系统。
注: 本章节示例来自官方文档pathlib — Object-oriented filesystem paths
2.1 初始化

初始化时可以传入一个或多个参数,参数可以是路径字符串,也可以是 pathlib.Path 对象,若没有传入任何参数,则默认为当前目录。
  1. >>> PurePath('setup.py')      # Running on a Unix machine
  2. PurePosixPath('setup.py')
  3. >>> PurePath('foo', 'some/path', 'bar')
  4. PurePosixPath('foo/some/path/bar')
  5. >>> PurePath(Path('foo'), Path('bar'))
  6. PurePosixPath('foo/bar')
  7. >>> PurePath()
  8. PurePosixPath('.')
复制代码
路径中间的 // 和 . 会被自动优化。
  1. >>> PurePath('foo//bar')
  2. PurePosixPath('foo/bar')
  3. >>> PurePath('//foo/bar')
  4. PurePosixPath('//foo/bar')
  5. >>> PurePath('foo/./bar')
  6. PurePosixPath('foo/bar')
  7. >>> PurePath('foo/../bar')
  8. PurePosixPath('foo/../bar')
复制代码
2.2 通用属性

一个 PurePath 或 其子类,都可以直接用在任何实现了 os.PathLike 接口的地方,并且如果想要 PurePath 对象代表的路径的字符串值,直接使用str即可。
  1. >>> import os
  2. >>> p = PurePath('/etc')
  3. >>> os.fspath(p)
  4. '/etc'
  5. >>> p = PurePath('/etc')
  6. >>> str(p)
  7. '/etc'
  8. >>> bytes(p)
  9. b'/etc'
  10. >>> p = PureWindowsPath('c:/Program Files')
  11. >>> str(p)
  12. 'c:\\Program Files'
复制代码
parts 属性提供了根据路径分隔符分隔的元组。
  1. >>> p = PurePath('/usr/bin/python3')
  2. >>> p.parts
  3. ('/', 'usr', 'bin', 'python3')
  4. >>> p = PureWindowsPath('c:/Program Files/PSF')
  5. >>> p.parts
  6. ('c:\\', 'Program Files', 'PSF')
复制代码
2.3 其他方法和属性

PurePath.drive
获取路径中的盘符(如果有),否则返回空字符串。
PurePath.anchor
PurePath.drive 和 PurePath.root 的结合。
  1. >>> PureWindowsPath('c:/Program Files/').anchor
  2. 'c:\\'
  3. >>> PureWindowsPath('c:Program Files/').anchor
  4. 'c:'
  5. >>> PurePosixPath('/etc').anchor
  6. '/'
  7. >>> PureWindowsPath('//host/share').anchor  # UNC shares
  8. '\\\\host\\share\\'
复制代码
PurePath.parents
返回一个存储了各个祖先节点的不可变序列。在 Python 3.10 开始,支持对其切片以及使用负向索引。
  1. >>> p = PureWindowsPath('c:/foo/bar/setup.py')
  2. >>> p.parents[0]
  3. PureWindowsPath('c:/foo/bar')
  4. >>> p.parents[1]
  5. PureWindowsPath('c:/foo')
  6. >>> p.parents[2]
  7. PureWindowsPath('c:/')
复制代码
PurePath.parent
返回上一级路径。注意,这个方法只是个“字符串上的切割”,不会查询实际的路径。
  1. >>> p = PurePosixPath('/a/b/c/d')
  2. >>> p.parent
  3. PurePosixPath('/a/b/c')
  4. >>> p = PurePosixPath('foo/..')  # 如果想要实际的路径信息,可以使用Path对象,先调用Path.resolve()获取绝对路径
  5. >>> p.parent
  6. PurePosixPath('foo')
复制代码
PurePath.name
按路径分割后,返回最后一级名称(会自动去除盘符 drive 和根路径符 root )。
  1. PurePosixPath('my/library/setup.py').name
  2. 'setup.py'
复制代码
PurePath.suffix
返回路径中的文件名后缀(如果有),如 .py 。
PurePath.suffixes
返回路径中最后一级的文件名后缀列表(如果有),如“library.tar.gz”的suffixes值为 ['.tar', '.gz'] 。
PurePath.stem
返回路径中最后一级的文件名(不含后缀 PurePath.suffix ),如“library.tar.gz”的stem值为 library.tar 。
PurePath.as_posix()
返回以斜杠表示的路径。
PurePath.is_absolute()
是否为绝对路径。
PurePath.joinpath(*pathsegments)
拼接路径,可以传入一个或多个字符串或Path对象。
PurePath.match(pattern, *, case_sensitive=None)
判断路径是否符合指定通配符模式。 case_sensitive 参数( Python 3.12 增加)在Windows系统默认为False,其他系统默认为True。如果 pattern 也是PurePath对象,此方法匹配效率会更高。
  1. >>> PurePath('a/b.py').match('*.py')
  2. True
  3. >>> PurePath('/a/b/c.py').match('b/*.py')
  4. True
  5. >>> PurePath('/a/b/c.py').match('a/*.py')
  6. False
  7. >>> pattern = PurePath('*.py')
  8. >>> PurePath('a/b.py').match(pattern)
  9. True
复制代码
PurePath.with_name(name)
使用指定的name替换原有的name,如果原路径就没有name,则抛出异常。
  1. >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
  2. >>> p.with_name('setup.py')
  3. PureWindowsPath('c:/Downloads/setup.py')
  4. >>> p = PureWindowsPath('c:/')
  5. >>> p.with_name('setup.py')
  6. Traceback (most recent call last):
  7.   File "<stdin>", line 1, in <module>
  8.   File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
  9.     raise ValueError("%r has an empty name" % (self,))
  10. ValueError: PureWindowsPath('c:/') has an empty name
复制代码
PurePath.with_stem(stem)
使用指定的stem替换原有的stem,如果原路径就没有stem,则抛出异常。
  1. >>> p = PureWindowsPath('c:/Downloads/draft.txt')
  2. >>> p.with_stem('final')
  3. PureWindowsPath('c:/Downloads/final.txt')
  4. >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
  5. >>> p.with_stem('lib')
  6. PureWindowsPath('c:/Downloads/lib.gz')
  7. >>> p = PureWindowsPath('c:/')
  8. >>> p.with_stem('')
  9. Traceback (most recent call last):
  10.   File "<stdin>", line 1, in <module>
  11.   File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
  12.     return self.with_name(stem + self.suffix)
  13.   File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
  14.     raise ValueError("%r has an empty name" % (self,))
  15. ValueError: PureWindowsPath('c:/') has an empty name
复制代码
PurePath.with_suffix(suffix)
使用指定的后缀(可以是空字符串)替换原有的后缀,如果原路径没有后缀,则会将后缀添加到原路径中。
  1. >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
  2. >>> p.with_suffix('.bz2')
  3. PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
  4. >>> p = PureWindowsPath('README')
  5. >>> p.with_suffix('.txt')
  6. PureWindowsPath('README.txt')
  7. >>> p = PureWindowsPath('README.txt')
  8. >>> p.with_suffix('')
  9. PureWindowsPath('README')
复制代码
三、path实体

path实体也提供了三个类Path(基类)、PosixPath、WindowsPath,Path继承自PurePath,所以PurePath支持的操作,path实体的三个类也是支持的。path实体与pure path区别在于,path实体对象支持系统操作,如获取绝对路径、遍历目录的所有子目录和文件、打开文件等,所以需要特别注意,在使用Path类时,可能会因为系统不支持导致抛出OSError等异常。
注: 本章节部分示例来自官方文档pathlib — Object-oriented filesystem paths
3.1 常用方法

Path.cwd()
返回当前路径,同 os.getcwd() 。
Path.home()
返回当前用户的home目录,同 os.path.expanduser() 。
Path.stat(*, follow_symlinks=True)
获取路径详细信息,同 os.stat() 。 follow_symlinks 参数在 Python 3.10 开始添加。
  1. >>> p = Path('setup.py')
  2. >>> p.stat().st_size
  3. 956
  4. >>> p.stat().st_mtime
  5. 1327883547.852554
复制代码
Path.chmod(mode, *, follow_symlinks=True)
修改文件权限,同 os.chmod() 。 follow_symlinks 参数在 Python 3.10 添加。
  1. >>> p = Path('setup.py')
  2. >>> p.stat().st_mode
  3. 33277
  4. >>> p.chmod(0o444)
  5. >>> p.stat().st_mode
  6. 33060
复制代码
Path.exists(*, follow_symlinks=True)
检查路径是否存在。 follow_symlinks 参数在 Python 3.12 添加。
Path.expanduser()
返回填充了home目录的路径。该方法在 Python 3.5 添加。
  1. >>> p = PosixPath('~/films/Monty Python')
  2. >>> p.expanduser()
  3. PosixPath('/home/eric/films/Monty Python')
复制代码
Path.glob(pattern, *, case_sensitive=None)
使用通配符遍历当前路径下的所有目录和文件。 case_sensitive ( Python 3.12 添加)默认为None,即使用当前系统的大小写规则,也可手动指定。当 pattern 以路径分隔符结尾,则只会列出目录,不会列出文件(该特性在 Python 3.11 添加)。
  1. >>> sorted(Path('.').glob('*.py'))
  2. [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
  3. >>> sorted(Path('.').glob('*/*.py'))
  4. [PosixPath('docs/conf.py')]
  5. >>> sorted(Path('.').glob('**/*.py'))
  6. [PosixPath('build/lib/pathlib.py'),
  7. PosixPath('docs/conf.py'),
  8. PosixPath('pathlib.py'),
  9. PosixPath('setup.py'),
  10. PosixPath('test_pathlib.py')]
复制代码
Path.group()
返回路径的属组。
Path.is_dir()
检查路径是否是目录。
Path.is_file()
检查路径是否是文件。
Path.is_junction()
检查路径是否是junction快捷方式(Windows系统专用)。
Path.is_mount()
判断路径是否是一个挂载点(该方法在 Python 3.7 添加,在 Python 3.12 支持Windows系统)。
Path.is_symlink()
判断路径是否是符号链接,如果路径不存在也会返回False。
Path.is_socket()
检查路径是否指向Unix socket文件,如果路径不存在也会返回False。
Path.is_fifo()
检查路径是否指向FIFO存储,如果路径不存在也会返回False。
Path.is_block_device()
检查路径是否指向块设备,如果路径不存在也会返回False。
Path.is_char_device()
检查路径是否指字符设备,如果路径不存在也会返回False。
Path.iterdir()
以生成器的方式遍历路径下的所有目录和文件。
Path.walk(top_down=True, on_error=None, follow_symlinks=False)
该方法在 Python 3.12 添加。递归遍历指定路径下的所有目录和文件,使用时由生成器每次生成一个三元组(当前遍历目录,子目录名列表,子文件名列表),想要使用某个子目录或子文件时,其全路径为“当前遍历目录+目录名/文件名”。

  • top_down 默认为True,即从上到下遍历,为False时表示从下到上遍历,“上下”的区别就是从当前目录的子目录开始往最里一层一层遍历遍历,还是从最深的子目录往外一层一层遍历。
  • on_error 默认为None,即忽略walk过程中的异常,也可手动指定一个可调用对象来处理异常,该对象的要求是接受发生的异常(OSError对象)。
  • follow_symlinks 默认为False,即在walk时,不会自动跟踪链接到真实的路径,列出的结果就是链接本身(该操作区别于 os.walk() )。
示例:有路径结构如下
  1. test1
  2.   - test2
  3.     - test2.txt
  4.   - test1.txt
复制代码
  1. >>> import pathlib
  2. >>> p = pathlib.Path('Z:\\Projects\\Daily Test\\pathlib_test\\test1')
  3. >>> for root, dirnames, filenames in p.walk():
  4.         print(root)
  5.         print(dirnames)
  6.         print(filenames)
  7.    
  8.     Z:\Projects\Daily Test\pathlib_test\test1
  9.     ['test2']
  10.     ['test1.txt']
  11.     Z:\Projects\Daily Test\pathlib_test\test1\test2
  12.     []
  13.     ['test2.txt']
  14. >>>
  15. >>> for root, dirnames, filenames in p.walk(top_down=False):
  16.         print(root)
  17.         print(dirnames)
  18.         print(filenames)
  19.    
  20.     Z:\Projects\Daily Test\pathlib_test\test1\test2
  21.     []
  22.     ['test2.txt']
  23.     Z:\Projects\Daily Test\pathlib_test\test1
  24.     ['test2']
  25.     ['test1.txt']
复制代码
Path.lchmod(mode)
类似 Path.chmod()  ,修改文件权限,区别在于,如果路径是一个链接,则只会修改链接本身,而链接指向的对象不会被修改。
Path.lstat()
类似 Path.stat() ,修改文件属性,区别在于,如果路径是一个链接,则只会修改链接本身,而链接指向的对象不会被修改。
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
创建目录。 parents 默认False,表示路径中的某个父目录不存在则会抛错, exist_ok 默认为False(该参数在 Python 3.5 添加),表示创建的路径已经存在则会抛错,这两个参数的行为与POSIX系统中的 mkdir -p 命令执行一致。
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
打开文件,同内置的open函数。
Path.owner()
返回路径的属主。
Path.read_bytes()
以byte类型返回文件的二进制内容。(该方法在 Python 3.5 添加)
Path.read_text(encoding=None, errors=None)
返回解码后的文件文本内容。文件打开后会立即关闭,参数的行为与内置的open函数相同。(该方法在 Python 3.5 添加)
Path.readlink()
返回链接指向的真实文件的路径,同 os.readlink() 。(该方法在 Python 3.9 添加)
Path.rename(target)
重命名文件或目录,并返回新的路径对象(返回值在 Python 3.8 添加)。在Unix是上静默修改,在Windows上则会修改失败。同 os.rename() 。
Path.replace(target)
替换一个已有的文件或目录,并返回新的路径对象(返回值在 Python 3.8 添加),如果待替换的路径为已存在的文件或空目录,则会强制替换。
Path.absolute()
返回绝对路径,但不会自动标准化路径,也不会自动解析符号链接。
Path.resolve(strict=False)
返回Path对象的绝对路径,会自动消除符号链接、“.”、“..”等格式的路径。当 strict=True 且文件路径不存在时,则抛出异常。(该参数在 Python 3.6 添加,在这之前版本默认为True)
  1. >>> p = Path()
  2. >>> p
  3. PosixPath('.')
  4. >>> p.resolve()
  5. PosixPath('/home/antoine/pathlib')
  6. >>> p = Path('docs/../setup.py')
  7. >>> p.resolve()
  8. PosixPath('/home/antoine/pathlib/setup.py')
复制代码
Path.rglob(pattern, *, case_sensitive=None)
按照给定通配符模式递归遍历子目录及文件。 pattern 参数若以路径分隔符结尾,则只遍历所有子目录,不会遍历文件(该规则在 Python 3.11 添加)。 case_sensitive 默认为None,即跟随系统大小写规则。(该参数在 Python 3.12 添加)。
Path.rmdir()
移除指定空目录(非空目录无法移除)。
Path.samefile(other_path)
判断两个文件是否相等, other_path 可以是Path对象,也可以是字符串。(该方法在 Python 3.5 添加)
Path.symlink_to(target, target_is_directory=False)
使当前Path对象成为一个符号链接,并指向 target 所表示的文件。 target_is_directory 参数在非Windows系统上会被忽略,不生效。
Path.hardlink_to(target)
使当前Path对象成为一个硬链接,并指向 target 所表示的文件。
Path.touch(mode=0o666, exist_ok=True)
创建一个路径,如果 exist_ok=False 且路径已经存在,则会抛出异常。
Path.unlink(missing_ok=False)
移除文件或符号链接。如果此Path对象指向的是目录,请使用 Path.rmdir() 。 missing_ok 默认为False,即路径不存在时抛出异常,反之则忽略异常。(该参数在 Python 3.8 添加)
Path.write_bytes(data)
以字节模式打开文件并写入字节数据,写入完成自动关闭文件。
Path.write_text(data, encoding=None, errors=None, newline=None)
以文本模式打开文件并写入文本数据,同内置的open函数。(该方法在 Python 3.5 添加, newline 参数在 Python 3.10 添加)

来源:https://www.cnblogs.com/guyuyun/p/18117563
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具