.pyd文件_附实战代码|告别OS模块,体验Python文件操作新姿势!

本文介绍Python内置库pathlib的基本使用方法,包括Path类的操作、与os模块的对比及实战案例,展示如何高效处理文件系统路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic。但是它不单纯是为了简化操作,还有更大的用途。

pathlib 是Python内置库,Python 文档给它的定义是:The pathlib module – object-oriented filesystem paths(面向对象的文件系统路径)

pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。

v2-eb34b1d763d72517781352a9bd4e26c8_b.jpg

更多详细的内容可以参考官方文档:

https://docs.python.org/3/library/pathlib.html#methods

一、Path 类的基本使用

下面是获取文件名、获取文件名除后缀的部分、获取文件后缀、返回一个iterable 包含所有父目录等常用操作示例

from pathlib import Path

path = r'D:pythonpycharm2020programpathlib模块的基本使用.py'
p = Path(path)
print(p.name)       # 获取文件名
print(p.stem)       # 获取文件名除后缀的部分
print(p.suffix)     # 获取文件后缀
print(p.parent)     # 相当于dirname
print(p.parent.parent.parent)
print(p.parents)    # 返回一个iterable 包含所有父目录
for i in p.parents:
    print(i)
print(p.parts)      # 将路径通过分隔符分割成一个元组

运行结果如下:

pathlib模块的基本使用.py
pathlib模块的基本使用
.py
D:pythonpycharm2020program
D:python
<WindowsPath.parents>
D:pythonpycharm2020program
D:pythonpycharm2020
D:python
D:
('D:', 'python', 'pycharm2020', 'program', 'pathlib模块的基本使用.py')
  • Path.cwd()返回表示当前目录的路径对象
  • Path.home()返回表示用户主目录的路径对象
  • Path.expanduser()返回带有扩展的 ~user 构造的新路径
from pathlib import Path

path_1 = Path.cwd()       # 获取当前文件路径
path_2 = Path.home()
p1 = Path('~/pathlib模块的基本使用.py')
print(path_1)
print(path_2)
print(p1.expanduser())

运行结果如下:

D:pythonpycharm2020program
C:UsersAdministrator
C:UsersAdministratorpathlib模块的基本使用.py

Path.stat()返回一个操作系统统计结果包含有关此路径的信息的对象

from pathlib import Path
import datetime

p = Path('pathlib模块的基本使用.py')
print(p.stat())            # 获取文件详细信息
print(p.stat().st_size)    # 文件的字节大小
print(p.stat().st_ctime)   # 文件创建时间
print(p.stat().st_mtime)   # 上次修改文件的时间
creat_time = datetime.datetime.fromtimestamp(p.stat().st_ctime)
st_mtime = datetime.datetime.fromtimestamp(p.stat().st_mtime)
print(f'该文件创建时间:{creat_time}')
print(f'上次修改该文件的时间:{st_mtime}')

运行结果如下:

os.stat_result(st_mode=33206, st_ino=3659174698076635, st_dev=3730828260, st_nlink=1, st_uid=0, st_gid=0, st_size=543, st_atime=1597366826, st_mtime=1597366826, st_ctime=1597320585)
543
1597320585.7657475
1597366826.9711637
该文件创建时间:2020-08-13 20:09:45.765748
上次修改该文件的时间:2020-08-14 09:00:26.971164

从不同.stat().st_属性 返回的时间戳表示自1970年1月1日以来的秒数,可以用datetime.fromtimestamp将时间戳转换为有用的时间格式。

  • Path.exists()路径是否存在于现有文件或目录
  • Path.resolve(strict=False)将路径设为绝对路径,解析任何符号链接。返回一个新的路径对象
from pathlib import Path

p1 = Path('pathlib模块的基本使用.py')          # 文件
p2 = Path(r'D:pythonpycharm2020program')   # 文件夹 
absolute_path = p1.resolve()
print(absolute_path)
print(Path('.').exists())
print(p1.exists(), p2.exists())
print(p1.is_file(), p2.is_file())
print(p1.is_dir(), p2.is_dir())
print(Path('/python').exists())
print(Path('non_existent_file').exists())

运行结果如下:

D:pythonpycharm2020programpathlib模块的基本使用.py
True
True True
True False
False True
True
False
  • Path.iterdir()当路径指向某个目录时,将生成该目录内容的path对象
from pathlib import Path

p = Path('/python')
# python目录下存在的文件
for child in p.iterdir():
    print(child)

运行结果如下:

pythonAnaconda
pythonEVCapture
pythonEvernote_6.21.3.2048.exe
pythonNotepad++
pythonpycharm-community-2020.1.3.exe
pythonpycharm2020
pythonpyecharts-assets-master
pythonpyecharts-gallery-master
pythonSublime text 3
  • Path.glob(pattern)Glob此路径表示的目录中给定的相对模式,生成所有匹配的文件(任何类型),**模式表示递归地此目录和所有子目录。换句话说,它支持递归全局化。
  • Note 在大型目录树中使用 **模式可能会耗费大量时间

递归遍历该目录下所有文件,获取所有符合pattern的文件,返回一个generator。

下面是一些常用操作的代码,拿走就用

获取该文件目录下所有.py文件

from pathlib import Path

path = r'D:pythonpycharm2020program'
p = Path(path)
file_name = p.glob('**/*.py')
print(type(file_name))   # <class 'generator'>
for i in file_name:
    print(i)

获取该文件目录下所有.jpg图片

from pathlib import Path

path = r'D:pythonpycharm2020program'
p = Path(path)
file_name = p.glob('**/*.jpg')
print(type(file_name))   # <class 'generator'>
for i in file_name:
    print(i)

获取给定目录下所有.txt文件、.jpg图片和.py文件

from pathlib import Path

def get_files(patterns, path):
    all_files = []
    p = Path(path)
    for item in patterns:
        file_name = p.rglob(f'**/*{item}')
        all_files.extend(file_name)
    return all_files

path = input('>>>请输入文件路径:')
results = get_files(['.txt', '.jpg', '.py'], path)
print(results)
for file in results:
    print(file)

关于Path.mkdir(mode=0o777, parents=False, exist_ok=False) 的说明

  • 在给定的路径上创建一个新目录。如果指定了mode,它将与进程的umask值结合起来,以确定文件模式和访问标志。如果路径已存在,则引发FileExistsError。
  • 如果parents参数设置为True,则将根据需要创建此路径的任何缺少的父级;它们是使用默认权限创建的,而不考虑模式(模仿POSIX mkdir-p命令)。
  • 如果父项为False(默认值),则缺少父项将引发FileNotFoundError。
  • 如果exist_ok为False(默认值),则在目标目录已存在的情况下引发FileExistsError。
  • 如果exist_ok为True,则将忽略 FileExistsError 异常(与POSIX mkdir-p命令的行为相同),但仅当最后一个路径组件不是现有的非目录文件时。

在版本3.5中更改:添加了exist_ok参数。

Path.rmdir():删除此目录,目录必须为空。

from pathlib import Path

p = Path(r'D:pythonpycharm2020programtest')
p.mkdir()
p.rmdir()
from pathlib import Path

p = Path(r'D:pythontest1test2test3')
p.mkdir(parents=True)  # If parents is true, any missing parents of this path are created as needed
p.rmdir()    # 删除的是test3文件夹
from pathlib import Path

p = Path(r'D:pythontest1test2test3')
p.mkdir(exist_ok=True)
  • Path.unlink()(missing_ok=False):删除此文件或符号链接。如果路径指向目录,请使用Path.rmdir()代替。如果missing_ok为False(默认值),则在路径不存在的情况下引发FileNotFoundError。如果missing_ok为true,则将忽略FileNotFoundError异常。在版本3.8中更改:添加了缺少的“确定”参数。
  • Path.rename()(target):将此文件或目录重命名为给定目标,并返回指向目标的新路径实例。在Unix上,如果目标存在并且是一个文件,如果用户有权限,它将被无提示地替换。目标可以是字符串或其他路径对象。
  • Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None):打开路径指向的文件,就像内置的 open() 函数一样。
from pathlib import Path

p = Path('foo.txt')
p.open(mode='w').write('some text')
target = Path('new_foo.txt')
p.rename(target)
content = target.open(mode='r').read()
print(content)
target.unlink()

二、与os模块用法的对比

v2-f823bc179458e1aa39ffb436a6302b72_b.jpg

三、实战案例

对于多层文件夹的读取,用os模块只能一层一层读取出文件,要写多个for循环,效率不高,这时我们可以用 Path.glob(**/*) 大法,下面以一个实际案例来体验它的强大。

用于测试的文件夹如下:

v2-b61e894b1602c8762bb08d217f5b632f_b.gif

md文件中数据如下:

v2-7ffbead495349de99f1e2eda9a43f8e3_b.jpg

需要实现将该目录下所有 md 文件的数据提取出来,并进行清洗,然后写入 csv 文件中

# -*- coding: UTF-8 -*-

运行效果如下:

v2-435e475831ddd61435479a38083f265b_b.gif

v2-5e728716b0a83803404d37f302af8044_b.gif

可以看到成功将该目录下所有 md 文件的数据提取出来,并进行清洗,然后写入了 csv 文件中。

这里帮朋友打个广告,在正学Python或者想学的都可以看看。

v2-35f42ea38f8d1fb4ef57d8aec1c58c12_b.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值