Python Pathlib生存手册,几个短例子极速上手

Pathlib是Python里自带的处理OS路径的library,功能非常强大,可以代替原来的

os.path
os.path。本文提供几个简单的例子供查询,帮您极速上手,引用到自己的python project里。

创建操作Path对象例子

p = Path('/home/feellikelearning')
p = Path('/home/feellikelearning')

可以用”/“直接得到下一层目录或文件的Path对象

codeDir = p / 'code'
codeDir = p / 'code'

Home Path对象例子

需要注意的是,Path constructor的参数不认识~。需要用

Path.home()
Path.home()

验证tilda不work

p = Path('~') print(p.as_posix()) print((p / 'code').as_posix()) print((p / 'code').exists()) # False
p = Path('~') print(p.as_posix()) print((p / 'code').as_posix()) print((p / 'code').exists()) # False

验证Path.home() work

p = Path.home() print(p.as_posix()) print((p / 'code').as_posix()) print((p / 'code').exists()) # True
p = Path.home() print(p.as_posix()) print((p / 'code').as_posix()) print((p / 'code').exists()) # True

当前目录例子

如果需要当前目录的对象可以用

cwd
cwd函数或者
.
.
resolve
resolve函数

p = Path.cwd() p = Path('.').resolve()
p = Path.cwd() p = Path('.').resolve()

遍历文件夹例子

也就是implement bash命令

find .
find .

用pathlib实现如下

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from pathlib import Path
def python_find(target_path_str):
def _python_find(p):
itr = p.iterdir()
for f in itr:
print(f.as_posix())
if f.is_dir():
_python_find(f)
p = pathlib.Path(target_path_str)
_python_find(p)
python_find('some/path')
from pathlib import Path def python_find(target_path_str): def _python_find(p): itr = p.iterdir() for f in itr: print(f.as_posix()) if f.is_dir(): _python_find(f) p = pathlib.Path(target_path_str) _python_find(p) python_find('some/path')
from pathlib import Path

def python_find(target_path_str):
    def _python_find(p):
        itr = p.iterdir()
        for f in itr:
            print(f.as_posix())
            if f.is_dir():
                _python_find(f)

    p = pathlib.Path(target_path_str)
    _python_find(p)

python_find('some/path')

外面函数python_find接受path string,里面的递归函数_python_find接受pathlib.Path object。用iterdir列出当前input path下的所有对象,先打印它们的路径,如果是目录,就继续调用递归函数_python_find打印下一层目录里面的内容。

Pathlib删除文件例子

删除文件

p = Path('/some/filepath/todelete') p.unlink()
p = Path('/some/filepath/todelete') p.unlink()

删除目录/文件夹

rmdir只能删除空的文件夹/目录,如果内部还有其他文件或目录会报错。

p = Path('/some/dir/todelete') p.rmdir()
p = Path('/some/dir/todelete') p.rmdir()

删除非空目录/文件夹

这个只能自己用上面两个函数用递归实现。这里我增加了显示被删除文件size的信息。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def rmdirRecursive(somePath: pathlib.PosixPath):
for f in somePath.iterdir():
if f.is_file():
filesize = f.stat().st_size
print(f'deleting {f.as_posix()} -> {filesize}')
f.unlink()
elif f.is_dir():
rmdirRecursive(f)
print(f'deleting directory {somePath.as_posix()}')
somePath.rmdir()
def rmdirRecursive(somePath: pathlib.PosixPath): for f in somePath.iterdir(): if f.is_file(): filesize = f.stat().st_size print(f'deleting {f.as_posix()} -> {filesize}') f.unlink() elif f.is_dir(): rmdirRecursive(f) print(f'deleting directory {somePath.as_posix()}') somePath.rmdir()
def rmdirRecursive(somePath: pathlib.PosixPath):
    for f in somePath.iterdir():
        if f.is_file():
            filesize = f.stat().st_size
            print(f'deleting {f.as_posix()} -> {filesize}')
            f.unlink()
        elif f.is_dir():
            rmdirRecursive(f)

    print(f'deleting directory {somePath.as_posix()}')
    somePath.rmdir()

参考

本文链接

Leave a Comment

Your email address will not be published.