pathlib,一个优雅的python库

【python】pathlib库的使用,详细 pathlib是 Python 中非常强大且简洁的文件路径操作库,它提供了面向对象的 API,使得路径操作更为直观和简便。你可以通过它来轻松进行文件路径的创建、检查、遍历、操作等任务。通过Path类,你可以跨平台处理文件路径,避免平台差异带来的问题。 阅读详情

前言

如果你需要在 Python 里进行文件处理,那么标准库中的os和os.path兄弟俩一定是你无法避开的两个模块。它们提供了非常多与文件路径处理、文件读写、文件状态查看相关的工具函数。

os.path一直是Python中处理路径事实上的标准,但它可能会显得有些繁琐。与之相比,pathlib模块提供了更简单、更直观的方式来完成绝大多数任务。

在Python3.4开始,官方提供了pathlib面向对象的文件系统路径,核心的点在于面向对象, 这也是os.path和pathlib的本质区别。

2019年Django也将os.path替换成了pathlib。

为什么需要pathlib?

在pathlib出现之前,Python的标准库os及os.path支持操作文件路径,使用字符串表示文件路径。

>>> import os.path
 
>>> os.path.abspath('test')
'F:\\spug-3.0\\spug-3.0\\spug_api\\test'

或者写出下面这种长长的代码:

>>> import os.path
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
False

但是路径并不只是一个字符串,如果需要对文件进行操作,需要结合使用多个标准库的功能,如: 需要移动当前目录下的一些文件到备份目录,需要使用os,glob和shutil库。

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)

而且,由于不同的操作系统使用的分隔符不同,使用字符串拼接路径就容易出现问题。

有了pathlib,使得上述的问题变得更加轻松,pathlib创建的Path对象,可以直接通过正斜杠运算符/连接字符串生成新的对象。

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41
import pathlib
from pathlib import WindowsPath

path = pathlib.Path()

if __name__ == '__main__':
    print(path)  # .
    print(path.absolute() / 'test' / 'data.txt')  # F:\spug-3.0\spug-3.0\spug_api\test\data.txt

pathlib的基本使用

Path类的常用属性和方法

descriptor:
    parts: 每一层路径
    parent: 父目录
    parents: 所有父目录
    stem: 不带后缀的文件名
    name: 文件名或目录名
    suffix: 文件名后缀
    suffixes: 文件名后缀列表

function:
    is_absolute: 是否为绝对路径
    joinpath: 组合路径
    cwd: 当前工作目录
    home: 根目录
    rename: 重命名
    replace: 覆盖
    touch: 新建文件
    exists: 是否存在路径
    expanduser: 返回带~和~user的路径
    glob: 列出匹配的文件或目录
    rglob: 递归列出匹配的文件或目录
    is_dir: 是否为目录
    is_file: 是否为文件
    iterdir: 列出路径下的文件和目录
    mkdir: 新建目录
    open: 打开文件
    resolve: 转成绝对路径
    rmdir: 删除目录
    ...

创建路径

前面用到了pathlib.Path()获取当前路径的方法,也可以显示的传入路径字符串进行路径创建,支持相对路径和绝对路径字符串的传递。

os.path

from os.path import abspath, dirname, join

manage_path = abspath("./manage.py")  # 绝对路径
base_dir = dirname(manage_path)  # 父目录
another_manage_path = join(base_dir, "another_manage.py")  # 构成新路径

print("manage_path:", manage_path)  
print("base_dir:", base_dir)  
print("another_manage_path:", another_manage_path)

# manage_path: F:\spug-3.0\spug-3.0\spug_api\manage.py
# base_dir: F:\spug-3.0\spug-3.0\spug_api
# another_manage_path: F:\spug-3.0\spug-3.0\spug_api\another_manage.py

pathlib

from pathlib import Path

manage_path = Path("manage.py").resolve()  # 绝对路径
base_dir = manage_path.parent  # 父目录
another_manage_path = base_dir / "another_manage.py"  # 构成新路径

print("manage_path:", manage_path)
print("base_dir:", base_dir)
print("another_manage_path:", another_manage_path)

显然用pathlib更加便捷和优雅!!

创建文件 Path.touch()

from pathlib import Path

path = Path()
new_path = path / "hello.py"
new_path.touch()

创建目录和重命名

os.path

import os
import os.path

os.makedirs(os.path.join("./src", "stuff"), exist_ok=True)  # 构建目录./src/stuff
os.rename("./src/stuff", "./src/config")  # 将./src/stuff重命名为./src/config

pathlib

from pathlib import Path

Path("./src/stuff").mkdir(parents=True, exist_ok=True)  # 构建目录./src/stuff
Path("./src/stuff").rename("./src/config")  # 将./src/stuff重命名为./src/config

mkdir方法:

  • parents默认为False,父目录不存在时抛出FileNotFoundError
  • exist_ok默认为False,该目录存在时抛出FileExistsError

递归列出某类型文件

假设目录:

(spug-3.0) PS F:\spug-3.0\spug-3.0\spug_api\path_lib_test> tree /F            

F:.
│  pathlib_test.py
│  __init__.py
│
└─test
        __init__.py

列出所有.py文件

os

# ! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from os import walk
from os.path import join, expanduser, abspath

home = expanduser('~')
python_files = []

for root, dirs, files in walk("./test"):
    python_files.extend([abspath(join(root, file)) for file in files if file.endswith('.mp4')])

# 现在python_files列表包含所有以'.mp4'结尾的文件的绝对路径

print(python_files)  # ['F:\\spug-3.0\\spug-3.0\\spug_api\\path_lib_test\\test\\1.mp4']

glob

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from glob import glob

top_level_py_files = glob("./*.py")
all_py_files = glob("./**/*.py", recursive=True)  # 递归

print(top_level_py_files)
print(all_py_files)

# ['.\\pathlib_test.py', '.\\__init__.py']
# ['.\\pathlib_test.py', '.\\__init__.py', '.\\test\\__init__.py']

pathlib

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

top_level_py_files = Path(".").glob("*.py") # 不进行递归
all_py_files = Path(".").rglob("*.py")  # 递归

print(list(top_level_py_files))
print(list(all_py_files))

# [WindowsPath('pathlib_test.py'), WindowsPath('__init__.py')]
# [WindowsPath('pathlib_test.py'), WindowsPath('__init__.py'), WindowsPath('test/__init__.py')]

glob不会确定地返回路径顺序。

打开多个文件并读取内容

glob

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from glob import glob

contents = []
for fname in glob("./**/*init*.py", recursive=True):
    with open(fname, "r") as f:
        contents.append(f.read())

print(contents)

# ["#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:20\n\n\nif __name__ == '__main__':\n    pass\n", "#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:22\n\n\nif __name__ == '__main__':\n    pass\n"]

pathlib

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

contents = []
for path in Path(".").rglob("*__init__.py"):
    with path.open("r", encoding="UTF-8") as file:
        contents.append(file.read())

print(contents)

# ["#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:20\n\n\nif __name__ == '__main__':\n    pass\n", "#! -*-conding=: UTF-8 -*-\n# 2023/12/6 17:22\n\n\nif __name__ == '__main__':\n    pass\n"]

操作符

使用/取代os.path.join进行路径拼接。

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

base_dir = Path(".")
child_dir = base_dir / "test"
file_path = child_dir / "__init__.py"

print(file_path)
# test\__init__.py

路径的每个位置 Path.parts

from pathlib import Path

file_path = Path("F:/spug-3.0/spug-3.0/spug_api/pathlib_test.py")
print(file_path.parts)
# ('F:\\', 'spug-3.0', 'spug-3.0', 'spug_api', 'pathlib_test.py')

父目录 Path.parents & Path.parent

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

file_path = Path("path_lib_test/test/__init__.py")

print(file_path.parents)   # <WindowsPath.parents>

for parent in file_path.parents:
    print(parent)

# path_lib_test\test
# path_lib_test
# .

print(file_path.parent)

# path_lib_test\test

文件名或目录名 Path.name

os.path

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

import os

print(os.path.basename("test/__init__.py"))  # __init__.py
print(os.path.basename("test"))  # test

pathlib

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

print(Path("test/__init__.py").name)  # __init__.py
print(Path("test").name)  # test

文件名后缀 Path.suffixes & Path.suffix

os.path

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

import os

print(os.path.splitext("test/__init__.py")[-1])

# ('test/__init__', '.py')

pathlib

from pathlib import Path

file_path = Path("test/__init__.py")
print(file_path.suffixes)  # ['.py']
print(file_path.suffix)  # .py

不带后缀文件名 Path.stem

os.path

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

import os


print(os.path.splitext(os.path.basename("test/__init__.py"))[0])  # __init__

pathlib

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

print(Path("test/__init__.py").stem)  # __init__

是否为绝对路径 Path.is_absolute()

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

file_path = Path("test/__init__.py")
print(file_path.is_absolute())  # False

组合路径 Path.joinpath(*other)

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

file_path = Path(".").joinpath("test", "__init__.py")
print(file_path)  # test\__init__.py

获取当前工作目录 Path.cwd()

和 os.getcwd() 返回的相同

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

file_path = Path()
print(file_path.cwd())  # F:\spug-3.0\spug-3.0\spug_api\path_lib_test

根目录 Path.home()

返回一个表示用户家目录的新路径对象。

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

print(Path.home())  # C:\Users\lianhf

是否存在路径 Path.exists()

os.path

import os.path

print(os.path.exists("test/aaaa.py"))
# False

pathlib

from pathlib import Path

file_path = Path("test/aaaa.py")
print(file_path.exists())
# False

返回带和user的路径 Path.expanduser()

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

file_path = Path("~/test/aaaa.py")
print(file_path.expanduser())  # C:\Users\lianhf\test\aaaa.py

是否为目录或文件 Path.is_dir() & Path.is_file()

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

dir_path = Path("test/")
print(dir_path.is_dir())  # True
print(dir_path.is_file())  # False
file_path = Path("test/__init__.py")
print(file_path.is_dir())  # False
print(file_path.is_file())  # True

列出路径下的文件和目录 Path.iterdir()

产生该路径下的对象的路径

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

base_path = Path(".")
contents = [content for content in base_path.iterdir()]

print(contents)  # [WindowsPath('pathlib_test.py'), WindowsPath('test'), WindowsPath('__init__.py')]

打开文件 Path.open()

事实上,Path.open() 是在幕后调用内置的 open() 函数。这就是为什么你可以在 Path.open() 中使用模式和编码等参数。

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __time__:2023/12/6 21:37


from pathlib import Path

path = Path.cwd() / "简答题.md"
with path.open(mode="r", encoding="utf-8") as md_file:
    content = md_file.read()
    groceries = [line for line in content.splitlines() if line.startswith("##")]
print("\n".join(groceries))

覆盖/移动 Path.replace()

将文件或目录重命名为给定的 target,并返回一个新的指向 target 的 Path 实例。

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

path = Path("test/__init__.py")

path.replace(path.parent / "__init2__.py") 

转成绝对路径 Path.resolve()

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

path = Path("test/__init__.py")

print(path.resolve())  # F:\spug-3.0\spug-3.0\spug_api\path_lib_test\test\__init__.py

strict设为True,如果路径不存在,则抛出FileNotFoundError

删除目录 Path.rmdir()

移除此目录。此目录必须为空的。

os.path

import os

os.rmdir("test/hello")

如果目录下不为空,抛出OSError

pathlib

from pathlib import Path

file_path = Path("test/hello")
file_path.rmdir()

如果目录下不为空,抛出OSError

删除文件 os.remove()/Path.unlink()

os

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

import os

os.remove("test/hello.txt")

pathlib

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __time__:2023/12/6 21:37
from pathlib import Path

p = Path('./username.txt')
p.unlink()

读写文件

  • .read_text(): 以文本模式打开路径,并以字符串形式返回内容。
  • .read_bytes(): 以二进制模式打开路径,并以字节字符串形式返回内容。
  • .write_text(): 打开路径并写入字符串数据。
  • .write_bytes(): 以二进制模式打开路径并向其中写入数据。
#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

# 除此之外,还有几个很甜的方法,省去了 with open 语句
path = Path("/home/ubuntu/readme.txt")
text = path.read_text(encoding="utf-8")
path.write_text(text)

path = Path("/home/ubuntu/image.png")
image = path.read_bytes()
path.write_bytes(image)

上述每个方法都会处理文件的打开和关闭。

移动文件 shutil.move()/path.rename()/path.replace()

shutil

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

import shutil

shutil.move('./__init__.py', './test')

pathlib

可以使用path.rename()或者path.replace()移动文件:

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path

path = Path('test/__init2__.py')
folder = Path('.')
path.rename(folder / path.name)

from pathlib import Path

source = Path("hello.py")
destination = Path("goodbye.py")

if not destination.exists():
    source.replace(destination)

上面的代码并非并发安全的!这里仅提供实现思路。

也可以换一种思路:

from pathlib import Path
import fcntl

source = Path("hello.py")
destination = Path("goodbye.py")

lock_file = Path("lock_file.lock")

try:
    with lock_file.open(mode="xb") as lock:
        fcntl.flock(lock, fcntl.LOCK_EX)  # 获取独占锁

        try:
            with destination.open(mode="xb") as file:
                file.write(source.read_bytes())
        except FileExistsError:
            print(f"File {destination} exists already.")
        else:
            source.unlink()
        finally:
            fcntl.flock(lock, fcntl.LOCK_UN)  # 释放锁

except FileExistsError:
    print(f"Another process is already handling the operation.")

重命名文件

文件重命名除了可以使用上述的path.rename(),还可以使用.with_stem(), .with_suffix(), 或者.with_name()结合.replace()来实现。

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __time__:2023/12/6 21:37

from pathlib import Path

txt_path = Path("./hello.txt")

md_path = txt_path.with_suffix(".md")

txt_path.replace(md_path)

使用.with_suffix()会返回一个新路径。要真正重命名文件,需要使用.replace()。这将把txt_path移到md_path,并在保存时重命名它。

如果要更改包括扩展名在内的完整文件名,可以使用.with_name():

from pathlib import Path

md_path = Path("./hello.md")

txt_path = md_path.with_name("goodbye.md")

md_path.replace(txt_path)

文件复制

令人惊讶的是,Path并没有复制文件的方法。不过,利用目前学到的pathlib知识,只需几行代码就能创建相同的功能:

from pathlib import Path

source = Path("shopping_list.md")
destination = source.with_stem("shopping_list_02")
destination.write_bytes(source.read_bytes())

使用.with_stem()创建新的文件名,但没有更改扩展名,并使用.read_bytes()读取源文件的内容,然后使用.write_bytes()将这些内容写入目标文件。

虽然使用 pathlib 来处理所有与路径相关的事情很有吸引力,但你也可以考虑使用shutil来复制文件。它是一个很好的选择,也知道如何处理路径对象。

检查路径是否符合规则

p = Path('data.json')
# math 检查匹配规则
print(p.match('*.json'))  # True

转Unix风格

as_posix():返回使用正斜杠(/)的路径字符串

from pathlib import Path

path = Path('/host/share')
print(str(path))  # \host\share
print(path.as_posix())  # /host/share

pathlib 是否比 os.path 更快?

在我尝试运行基准测试之前,我猜它不是。Path()是一种面向对象的路径操作方法。实例化一个对象可能比调用os.path.join(只需吐出一个字符串)更费时。

但即使慢,我也很好奇到底慢了多少。另外,谁知道呢,也许我的直觉是错的?

废话不多说,直接来看下路径拼接的快慢对比:

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __time__:2023/12/6 21:37

# pathlib_benchmarks.py

import os
from pathlib import Path


def os_path_join():
    return os.path.join("/", "how", "do", "you", "do", "hello", "world.txt")


def pathlib_join():
    return Path("/") / "how" / "do" / "you" / "do" / "hello" / "world.txt"

我们定义一个pathlib_benchmarks.py的脚本,os_path_join和pathlib_join方法分别使用os.path和path模块实现,然后执行测试:

PS E:\projects\mkwang\python_and_go> python -m timeit -s "from pathlib_benchmarks import pathlib_join" "pathlib_join()"
10000 loops, best of 5: 21.9 usec per loop
PS E:\projects\mkwang\python_and_go> python -m timeit -s "from pathlib_benchmarks import os_path_join" "os_path_join()"
50000 loops, best of 5: 6.95 usec per loop

结果和预期的差不太多!更多的对比,如果你有兴趣的话可以自己试试~

常用脚本

统计文件个数

我们可以使用.iterdir方法获取当前文件下的所有文件。

import pathlib
from collections import Counter

now_path = pathlib.Path.cwd()
gen = (i.suffix for i in now_path.iterdir())
print(Counter(gen))  # Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1})

查看目录中最近修改的文件

from pathlib import Path
from datetime import datetime

directory = Path.cwd()
time, file_path = max((f.stat().st_mtime, f) for f in directory.iterdir())
print(datetime.fromtimestamp(time), file_path)  # 023-12-06 22:56:09.532177 E:\projects\mkwang\python_and_go\pathlib_test.py

移动子文件夹下的所有文件到本文件夹

from pathlib import Path

current_file = Path(__file__).absolute()

for path in Path('.').rglob('*'):
    if path == current_file or path.parent == Path('.'):
        continue
    if path.is_file():
        try:
            new_path = Path('.') / path.name
            path.rename(new_path)
        except Exception as e:
            print(f"Error moving {path}: {e}")

展示目录树

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

import pathlib


def print_tree(directory, depth=0):
    spacer = '    ' * depth
    print(f'{spacer}+ {directory.name}/')

    for path in sorted(directory.rglob('*')):
        if path.is_file():
            print(f'{spacer}    {path.name}')
        else:
            print_tree(path, depth + 1)


if __name__ == '__main__':
    current_path = pathlib.Path.cwd()
    print_tree(current_path)

批量重命名

#! -*-conding=: UTF-8 -*-
# 2023/12/6 11:41

from pathlib import Path


def batch_rename(directory_path):
    directory = Path(directory_path)

    for file_path in directory.glob('*'):
        if file_path.is_file():
            new_name = file_path.stem.split(' RAW')[0] + '.mp4'
            new_path = file_path.with_name(new_name)
            file_path.rename(new_path)


if __name__ == '__main__':
    target_directory = './test'  # 需要批量重命名的路径
    batch_rename(target_directory)

获取文件大小

import os
from pathlib import Path

print(os.path.getsize('test/1.mp4'))
print(Path('test/1.mp4').stat().st_size)

文件存在且不为空

from pathlib import Path


def path_exists(path):
    """文件存在且不为空"""
    if path and Path(path).exists() and Path(path).stat().st_size > 0:
        return True
    return False


print(path_exists(''))  # False
print(path_exists('abc.txt'))  # False
print(path_exists(__file__))  # True

小结

从 Python 3.4 开始,pathlib已在标准库中提供。创建、删除、读取、写入、查找、移动、复制、拆分,以及其他任何你想对文件路径或文件本身执行的操作,pathlib可能都有相应的功能。使用pathlib,文件路径可以由适当的Path对象表示,而不是像以前一样用纯字符串表示。 这些对象使代码处理文件路径:

  • 更容易阅读,特别是可以使用 “/” 将路径连接在一起
  • 更强大,直接在对象上提供最必要的方法和属性
  • 在操作系统中更加一致,因为Path对象隐藏了不同系统的特性

当然,os.path或其他模块可以更快地完成这些操作。

功能os 和 os.pathpathlib
绝对路径os.path.abspath()Path.resolve()
改变文件的模式和权限os.chmod()Path.chmod()
新建目录os.mkdir()Path.mkdir()
新建目录os.makedirs()Path.mkdir()
重命名os.rename()Path.rename()
覆盖os.replace()Path.replace()
删除目录os.rmdir()Path.rmdir()
移除此文件或符号链接os.remove(), os.unlink()Path.unlink()
当前工作目录os.getcwd()Path.cwd()
是否存在路径os.path.exists()Path.exists()
根目录os.path.expanduser()Path.expanduser(), Path.home()
列出路径下的文件和目录os.listdir()Path.iterdir()
是否为目录os.path.isdir()Path.is_dir()
是否为文件os.path.isfile()Path.is_file()
是否指向符号链接os.path.islink()Path.is_symlink()
创建硬链接os.link()Path.link_to()
将此路径创建为符号链接os.symlink()Path.symlink_to()
返回符号链接所指向的路径os.readlink()Path.readlink()
返回 os.stat_result 对象包含此路径信息os.stat()Path.stat(), Path.owner(), Path.group()
是否为绝对路径os.path.isabs()PurePath.is_absolute()
连接路径os.path.join()PurePath.joinpath()
文件名或目录名os.path.basename()PurePath.name
父目录os.path.dirname()PurePath.parent
是否相同文件os.path.samefile()Path.samefile()
文件名后缀os.path.splitext()PurePath.suffix
移动文件shutil.move()Path.rename()

更多内容和细节请参考官方文档~

一起学习

欢迎大家关注我的账号,你的支持,是我更文的最大动力!

也欢迎关注我的公众号: 海哥python,领取更多python学习和面试资料。

微信号:fenggeniubi_2023

参考文献

https://docs.python.org/zh-cn/3.11/library/pathlib.html
https://stackoverflow.com/questions/2104080/how-do-i-check-file-size-in-python
https://docs.python.org/zh-cn/3/library/os.path.html
https://docs.python.org/zh-cn/3/library/shutil.html
https://docs.python.org/zh-cn/3/library/os.html
https://switowski.com/blog/pathlib/
https://betterprogramming.pub/should-you-be-using-pathlib-6f3a0fddec7e
https://peps.python.org/pep-0428/
https://realpython.com/python-pathlib/

Python pathlib库:告别os.path,用面向对象优雅处理文件路径 面向对象:路径是对象,属性/方法操作更直观,告别os.path的函数堆砌。跨系统兼容:自动处理(macOS/Linux)和(Windows),无需手动适配。简洁高效运算符拼接路径、直接读写文件,代码量减少30%+。功能全面:覆盖路径判断、创建/删除、遍历、解析等所有场景,无需依赖其他库。如果你还在使用os.path,建议尽快切换到pathlib——它是Python官方推荐的路径处理方式,也是未来的趋势。赶紧在项目中试试吧!需求pathlib实现创建Path对象拼接路径获取文件名p.name获取父目录。 阅读详情

相关推荐

Unity游戏开发实战:如何用科大讯飞离线语音合成SDK实现NPC对话(附完整代码)

本文详细介绍了如何在Unity游戏开发中使用科大讯飞离线语音合成SDK实现NPC对话系统。通过完整的代码示例和优化技巧,开发者可以快速集成本地语音合成功能,提升游戏沉浸感,同时避免网络延迟问题。文章涵盖SDK集成、核心语音合成模块实现以及高级应用技巧,特别适合RPG游戏开发者参考。

weixin_29268385的博客 181

Python - pathlib 库的详细介绍

​2. 路径解析与组合 3. 路径检测与属性 4. 文件操作 5. 文件读写 6. 目录遍历 2. 统计目录大小 3. 配置文件读取 ​4. 创建项目结构 四、与传统 对比

wanglaqqqq的博客 1362

Pluto SDR新手避坑指南:从环境配置到第一个MATLAB收发程序(附完整代码)

本文为Pluto SDR新手提供全面的避坑指南,从硬件连接到MATLAB环境配置,再到第一个信号收发程序的实现。详细介绍了驱动安装、常见问题排查以及关键参数设置,帮助用户快速上手软件定义无线电(SDR)技术,并附有完整代码示例。

weixin_33168937的博客 324

Python中的pathlib和Path(面向对象的文件系统路径操作库)

一种内置的面向对象的文件系统路径操作库,本篇文章介绍了Path中的常见的属性和方法,并给出了代码示例。

Le0v1n 的博客 7171

DeepSeek Harness接入QQ实战:把DSH变成赛博群友

大模型应用正从单机问答走向多平台集成,如何将模型能力嵌入即时通讯工具成为工程实践的热点。消息接入、会话管理、插件扩展是构建智能群聊机器人的核心三要素。DeepSeek Harness(DSH)作为一款模型会话工作流管理工具,凭借多会话管理、模型调用编排以及灵活的插件机制,能够在QQ群聊场景中实现“接收消息→模型生成→回复推送”的完整闭环。本文从基础概念切入,详解DSH接入QQ的两种实现路线——外部API转发与原生插件适配,覆盖环境准备、启动调试、接口调用与性能观察,并给出常见问题排查清单。无论是本地AI助理

weixin_27427619的博客 1815

STK传感器配置全攻略:从光学到雷达的7种视场类型详解(附避坑指南)

本文详细解析了STK软件中传感器的7种视场类型,从基础的Simple Conic、Complex Conic到高级的SAR与EOIR,提供了完整的配置步骤与实战避坑指南。重点阐述了雷达、光学等不同物理设备的建模选择逻辑,并针对常见的“No Access”等报错问题给出了系统性的排查方案,帮助工程师高效完成卫星系统设计与任务分析。

weixin_29232507的博客 227

Python标准库-pathlib

pathlib模块是Python 3.4引入的标准库模块,它提供了一种面向对象的方式来处理文件系统路径。相比传统的os.path模块,pathlib提供了更现代、更直观的API,使路径操作更加简单和优雅。它是处理文件路径的推荐方式,特别适合现代Python项目。pathlib模块是Python中处理文件路径的现代解决方案。通过合理使用pathlib简化路径操作提高代码可读性增强跨平台兼容性优化文件操作提升开发效率优先使用pathlib而不是os.path注意路径对象的不可变性。

Aerkui的博客 1544

CH32V IAP跳转避坑指南:为什么你的APP跳不过去?从mstatus寄存器配置到函数属性详解

本文深入解析CH32V系列MCU的IAP跳转机制,从mstatus寄存器配置到函数属性优化,详细讲解如何避免APP跳转失败。文章涵盖地址准备、模式切换、跳转执行等关键步骤,并提供调试技巧与实战案例,帮助开发者快速解决CH32V IAP跳转中的常见问题。

weixin_30955617的博客 138

Python内置库:pathlib模块详解

Pathlib模块提供了表示文件系统路径的类,其语义适用于不同的操作系统。路径类分为纯路径和具体路径,前者提供无I/O的纯计算操作,后者继承纯路径,但也提供I/O操作。

weixin_68789096的博客 1740

62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能

本文通过一个实际的例子,介绍了如何不通过修改 SAP 标准 ABAP 程序源代码的方式,对其的功能进行增强,即采取 ABAP 增强开发的方式进行二次开发,这是一种在实际 SAP 项目实施过程中使用非常广泛的技术。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3303

科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南

在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

m0_64661770的博客 152

pathlib, 一个优雅的python库,os和os.path两个模块的更优解!

但是路径并不只是一个字符串,如果需要对文件进行操作,需要结合使用多个标准库的功能,如: 需要移动当前目录下的一些文件到备份目录,需要使用。创建、删除、读取、写入、查找、移动、复制、拆分,以及其他任何你想对文件路径或文件本身执行的操作,获取当前路径的方法,也可以显示的传入路径字符串进行路径创建,支持相对路径和绝对路径字符串的传递。,使得上述的问题变得更加轻松,pathlib创建的Path对象,可以直接通过正斜杠运算符。而且,由于不同的操作系统使用的分隔符不同,使用字符串拼接路径就容易出现问题。

m0_59236602的博客 1724

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

pathlib一个优雅的路径操作模块,碾压os

对于 Python 中的路径操作,大多数人第一反应肯定是 os,可以说 os 已经在老一辈 Python coder 心中扎深蒂固,现存的很多教程中操作路径仍然使用 os,殊不知从 python3.4 开始,pathlib 正式成为标准库,已经能够完全取代 os。无论从功能还是易用性都已经超越 os。 看个经典的例子,我们分别使用 os 与 pathlib 来获取上层目录和上上层目录。 os 方法 import os.path # 获取上层目录 os.path.dirname(os.getcwd()) #

向日葵的专属太阳 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python文件路径操作及pathlib库

对文件的路径操作是一个非常基础的问题,但也是一个至关重要的问题,优雅的路径操作不仅可以让代码可读性更高;还可以让用户避免很多不必要的麻烦。python中路径操作常用的几种方式重要包括:字符串拼接、os.path、以及python 3.4中新增的面向对象的路径操作库 pathlib。 字符串拼接 字符串拼接是最原始、最不优雅的路径操作方式,也是很多初学者偏爱的方式,但是强烈推荐使用以下两种更优雅的路径操作方式。因为不推荐字符串拼接,所以下面简要列举一下常见的拼接方式(更多字符串操作方法请见Python字符串处

jeffery0207的博客 2948

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

快速上手 Python pathlib —— 更优雅的路径操作方式

本文介绍了 Python 3.4 引入的 pathlib 模块,这是一个面向对象的文件路径操作库。与传统的 os.path 相比,pathlib 提供了更直观、简洁的路径操作方法,支持路径拼接、文件属性获取、文件系统操作等功能。文章详细讲解了如何创建路径对象、路径拼接、获取路径信息、文件目录操作、文件读写、目录遍历等核心功能,并通过多个实用示例展示了 pathlib 的实际应用场景。最后对比了 pathlib 与 os.path 的差异,突出了 pathlib 在代码简洁性、可读性和跨平台兼容性方面的优势。

经天纬地,格物致理 1698

Pathlib,一个不怕迷路的 Python 向导

pathlib 是 Python 3.4 版本引入的标准库,它是一个非常有用和强大的工具,为文件路径操作提供了一种更加优雅和 Pythonic 的方式。通过 pathlib,我们可以轻松地进行文件路径的拼接、判断文件是否存在、创建目录、遍历文件夹等操作,使得文件处理变得更加方便和高效。它提供了面向对象的方式来操作文件路径和文件系统,让文件处理变得更加简洁和易读。在本篇文章中,我们将探讨 pathlib 模块的功能和用法,并结合多个代码示例来展示其灵活性和便捷性。

小鸿的博客 1353

Python内置模块pathlib:更优雅的文件系统路径操作指南

Python 的pathlib库是 Python 3.4 + 引入的面向对象文件系统路径处理模块,以直观的对象化方式替代传统os.path的字符串操作,大幅简化路径处理逻辑。它将路径封装为Path对象,支持链式调用,例如Path(“/home”) / “user” / “file.txt"即可完成路径拼接,无需关注系统分隔符差异。

老衲爱洗头的博客 1483

pathlib安装_pathlib介绍-比os.path更好的路径处理方式

我们先来聊下三种操作系统windows、Mac 和 Linux,Windows filenames: C:some_foldersome_file.txt Most other operating systems: /some_folder/some_file.txt如上所示,带来的一个编程小麻烦就是不同的操作系统,文件连接所用正反斜线是不一致的。这是一个有趣的历史:early 1980’s co...

weixin_39926042的博客 2651

from pathlib import path_华丽的蜕变-使用Pathlib模块,文件操作So Easy!

更多精彩内容,请关注微信公众号:python学习开发。前言 大多人处理文件用的最多的还是os模快吧,比如下面这样的操作>>> path.rsplit('', maxsplit=1)[0] 或者写出下面这样长长的代码>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))...

weixin_39684228的博客 8033

Python pathlib模块详解:优雅处理文件路径

更多Python学习内容:ipengtao.com在Python中,pathlib模块提供了一种优雅而直观的方式来处理文件路径和文件系统操作。本文将深入探讨pathlib模块的使用方法、常用类和方法、路径操作技巧以及示例代码,帮助更好地理解和应用路径处理功能。pathlib模块简介pathlib模块是Python 3.4及以上版本中引入的标准库,用于处理文件路径和文件系统操作。它提供了一种面向对象...

GitHub_miao的博客 1229

Python的内置库pathlib

相信你一定用os库对文件系统进行过操作,比如文件读写,路径组合,上传下载等都会涉及到文件路径。但是某些操作使用os库就很不优雅,例如查找上级路径,不同操作系统间的路径处理等。今天我们就介...

Python研究所 1021

python 父路径_Python的内置库pathlib

相信你一定用os库对文件系统进行过操作,比如文件读写,路径组合,上传下载等都会涉及到文件路径。但是某些操作使用os库就很不优雅,例如查找上级路径,不同操作系统间的路径处理等。今天我们就介绍一个Python内置的面向对象的路径库pathlib。1、获取当前文件所在路径from os import pathexec_path = path.dirname(__file__)print(exe...

weixin_39907131的博客 575

Python小酷库系列:pathlib,全面取代os.path的路径操作小能手

相比 os.path,pathlib 代码更直观、优雅、跨平台一致性更好,并支持链式调用,非常适合现代 Python 项目。

GeekABC 1022

python路径,pathlib更优雅

os.path将系统路径视为字符串,容易出现混乱。而pathlib将路径表示为独特的对象,并且引入了更多可扩展的用法,获取路径会更方便。,如果给定的路径对象是嵌套的,则仅删除最后一个子目录。Path子类的使用,可以用该类创建文件夹和目录。它将返回带有后缀的文件名,若只想要前缀,则使用。假设我们需要获取某个文件夹下所有的txt文件。检查路径是否存在,可以使用布尔函数。如果要将路径分成多个部分,可以使用。的方式,比如,使用当前工作路径。属性,它会创建一个生成器。查找主目录中所有文本文件。要删除目录,可以使用。

qxqsunshine的博客 359

python pathlib模块_Python实用模块推荐_click_pathlib

click是一个创建命令行接口的第三方python库,是Command Line Interface Creation Kit的缩写。click具有高度可配置、代码量更少、代码更加优雅等特点。是argparse的升级版。安装clickpip install clickimport click@click.command()@click.option(‘–count’, default=1, hel...

weixin_39886172的博客 92
上一篇: 【python】魔术方法大全(四)——类构建篇
下一篇: 【python】上下文管理器和with语句
海哥python
博客等级 码龄9年 1487粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

海哥python

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

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

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

打赏作者

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

抵扣说明:

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

余额充值