一文带你掌握Python3中文件和文件夹操作的核心模块

 更新时间:2026年05月08日 09:17:50   作者:曾阿伦  
本文总结了Python3中文件/文件夹操作的核心模块,包括传统模块os,os.path,shutil和现代化模块pathlib,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

本文整理 Python3 核心文件 / 文件夹操作,聚焦与osos.pathshutil,以及传统模块与 Python3.4+ 新增的pathlib和现代化模块,涵盖路径处理、文件读写、目录管理、批量操作等!

一、核心模块与环境说明

1. 模块特性对比

模块核心优势适用场景版本要求
os系统底层操作,功能全面进程管理、系统命令调用、基础文件操作Python3 全版本
os.path路径字符串处理,跨平台兼容路径拼接、判断、拆分Python3 全版本
shutil高级文件操作,封装常用功能复制、移动、删除、压缩Python3 全版本
pathlib面向对象 API,语法简洁,可读性强路径处理、文件读写、目录遍历Python3.4+

2. 基础导入语句

# 传统模块(兼容所有Python3版本)
import os
import os.path as op
import shutil

# 现代化模块(Python3.4+推荐)
from pathlib import Path

二、路径处理操作

1. 传统方式(os + os.path)

# 1. 获取当前工作目录
current_dir = os.getcwd()
print("当前目录:", current_dir)

# 2. 路径拼接(避免硬编码分隔符)
file_path = op.join(current_dir, "data", "test.txt")
print("拼接路径:", file_path)  # 输出: 跨平台自动适配(Windows\,Linux/Mac/)

# 3. 路径拆解
print("目录名:", op.dirname(file_path))  # 输出: 父目录路径
print("文件名:", op.basename(file_path))  # 输出: test.txt
print("扩展名:", op.splitext(file_path)[1])  # 输出: .txt
print("文件名(无扩展名):", op.splitext(op.basename(file_path))[0])  # 输出: test

# 4. 路径判断
print("是否为文件:", op.isfile(file_path))
print("是否为目录:", op.isdir(current_dir))
print("路径是否存在:", op.exists(file_path))
print("是否为绝对路径:", op.isabs(file_path))

# 5. 获取绝对路径
abs_path = op.abspath("relative/path")
print("绝对路径:", abs_path)

2. 现代化方式(pathlib)

# 1. 创建路径对象(推荐方式)
current_dir = Path.cwd()  # 获取当前目录
file_path = current_dir / "data" / "test.txt"  # 路径拼接(支持/运算符)
print("路径对象:", file_path)  # 自动适配系统路径格式

# 2. 路径属性(直观易用)
print("目录名:", file_path.parent)  # 父目录(可链式调用:file_path.parent.parent)
print("文件名:", file_path.name)  # 完整文件名:test.txt
print("扩展名:", file_path.suffix)  # 扩展名:.txt
print("文件名(无扩展名):", file_path.stem)  # 文件名:test
print("绝对路径:", file_path.absolute())

# 3. 路径判断(面向对象方法)
print("是否为文件:", file_path.is_file())
print("是否为目录:", current_dir.is_dir())
print("路径是否存在:", file_path.exists())
print("是否为绝对路径:", file_path.is_absolute())

# 4. 路径匹配(支持glob模式)
print("匹配所有txt文件:", list(current_dir.glob("*.txt")))
print("递归匹配所有py文件:", list(current_dir.rglob("*.py")))  # Python3.5+

三、文件操作

1. 基础读写

# 1. 文本文件写入(覆盖模式)
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("Python文件操作备忘录\n")
    f.writelines(["第一行内容\n", "第二行内容\n"])

# 2. 文本文件读取
with open("test.txt", "r", encoding="utf-8") as f:
    content = f.read()  # 读取全部内容
    # content = f.readline()  # 读取一行
    # content = f.readlines()  # 读取所有行到列表

# 3. 二进制文件操作(如图片、视频)
with open("image.jpg", "rb") as f:
    binary_data = f.read()  # 读取二进制数据
with open("image_copy.jpg", "wb") as f:
    f.write(binary_data)  # 写入二进制数据

# 4. 文件指针控制(seek/tell)
with open("test.txt", "r", encoding="utf-8") as f:
    f.seek(10)  # 移动到第10字节位置
    print("当前指针位置:", f.tell())  # 返回当前指针位置
    f.seek(0, 2)  # 移动到文件末尾(适合追加前定位)

2. pathlib 简化读写

# 1. 文本文件读写(一行搞定)
file = Path("test_pathlib.txt")
file.write_text("pathlib 简化文件操作\n", encoding="utf-8")  # 写入
content = file.read_text(encoding="utf-8")  # 读取
print("读取内容:", content)

# 2. 二进制文件读写
bin_file = Path("image_copy.jpg")
bin_file.write_bytes(binary_data)  # 写入二进制
read_bin = bin_file.read_bytes()  # 读取二进制

# 3. 逐行读取(大文件友好)
with file.open("r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())

四、目录操作(创建 / 删除 / 遍历)

1. 传统方式(os + shutil)

# 1. 创建目录
os.mkdir("new_dir")  # 创建单级目录(父目录不存在则报错)
os.makedirs("parent_dir/child_dir", exist_ok=True)  # 创建多级目录(Python3.2+支持exist_ok)

# 2. 删除目录
os.rmdir("new_dir")  # 删除空目录(非空则报错)
shutil.rmtree("parent_dir")  # 强制删除目录(含所有子文件/目录,慎用!)

# 3. 目录遍历
# 方式1:列出目录内容(仅当前级)
for name in os.listdir("target_dir"):
    full_path = op.join("target_dir", name)
    if op.isfile(full_path):
        print("文件:", name)
    else:
        print("目录:", name)

# 方式2:递归遍历目录(Python3.5+)
for root, dirs, files in os.walk("target_dir"):
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")

2. 现代化方式(pathlib)

# 1. 创建目录
Path("new_dir").mkdir(exist_ok=True)  # 单级目录
Path("parent_dir/child_dir").mkdir(parents=True, exist_ok=True)  # 多级目录(parents=True必选)

# 2. 删除目录
Path("new_dir").rmdir()  # 删除空目录
shutil.rmtree("parent_dir")  # pathlib无强制删除,需配合shutil

# 3. 目录遍历
# 方式1:遍历当前级内容
for item in Path("target_dir").iterdir():
    if item.is_file():
        print("文件:", item.name)
    else:
        print("目录:", item.name)

# 方式2:递归遍历(推荐,简洁直观)
for file in Path("target_dir").rglob("*"):
    if file.is_file():
        print("递归找到文件:", file)

五、高级操作

1. 文件复制与移动

# 1. 文件复制
shutil.copy("source.txt", "dest.txt")  # 复制文件内容和权限
shutil.copy2("source.txt", "dest_dir/")  # 复制文件+保留元数据(创建时间等)
shutil.copyfile("source.bin", "dest.bin")  # 仅复制文件内容(无权限)

# 2. 目录复制(递归复制所有内容)
shutil.copytree("source_dir", "dest_dir", dirs_exist_ok=True)  # Python3.8+支持覆盖

# 3. 文件/目录移动(剪切)
shutil.move("source.txt", "target_dir/")  # 移动文件到目录
shutil.move("old_dir", "new_dir")  # 重命名目录(目标不存在)或移动到目标目录

# 4. 压缩与解压
# 压缩(创建zip包)
shutil.make_archive("archive", "zip", root_dir="target_dir")  # 生成archive.zip
# 解压(提取zip包)
shutil.unpack_archive("archive.zip", extract_dir="unpack_dir")

2. 批量文件处理

# 场景1:按扩展名分类文件(如图片、文档)
from pathlib import Path
import shutil

ext_map = {
    ".jpg": "Images",
    ".png": "Images",
    ".pdf": "Documents",
    ".docx": "Documents",
    ".mp3": "Music"
}

source_dir = Path(".")
for file in source_dir.iterdir():
    if file.is_file() and file.suffix in ext_map:
        target_dir = Path(ext_map[file.suffix])
        target_dir.mkdir(exist_ok=True)  # 确保目标目录存在
        shutil.move(file, target_dir / file.name)  # 移动文件
        print(f"已移动: {file.name} -> {target_dir.name}")

# 场景2:批量重命名文件(如添加前缀)
for i, file in enumerate(Path("images").glob("*.jpg")):
    new_name = f"photo_{i:03d}{file.suffix}"  # 生成001、002格式
    file.rename(file.parent / new_name)
    print(f"重命名: {file.name} -> {new_name}")

# 场景3:统计目录下文件大小
def get_dir_size(dir_path):
    total_size = 0
    for file in Path(dir_path).rglob("*"):
        if file.is_file():
            total_size += file.stat().st_size  # 获取文件大小(字节)
    return total_size / (1024 * 1024)  # 转换为MB

print(f"目录总大小: {get_dir_size('target_dir'):.2f} MB")

六、避坑指南

路径分隔符问题:永远使用 os.path.join()pathlib/ 运算符拼接路径,避免直接写死 \/,确保跨平台兼容;

文件编码规范:读写文本文件时必须指定 encoding="utf-8",避免默认编码导致中文乱码(Windows 默认 gbk,Linux/Mac 默认 utf-8);

资源释放原则:始终使用 with 语句操作文件,自动关闭文件句柄,避免资源泄露;

删除操作警告shutil.rmtree()os.remove() 是不可逆操作,生产环境需添加二次确认逻辑,或先备份再删除;

版本兼容性

  • pathlib.rglob() 需 Python3.5+;
  • shutil.copytree(dirs_exist_ok=True) 需 Python3.8+;
  • 若需兼容低版本,优先使用 os + os.path 组合;

大文件处理:避免使用 read() 一次性读取超大文件(占用内存),推荐 readline() 逐行读取或 pathlib 迭代器;

权限问题:复制 / 移动文件时注意权限继承,shutil.copy2() 保留元数据更适合需要追溯文件历史的场景。

以上就是一文带你掌握Python3中文件和文件夹操作的核心模块的详细内容,更多关于Python3文件和文件夹操作的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Python中ping命令的深层原理

    详解Python中ping命令的深层原理

    Ping命令是网络管理员和普通用户最常用的网络工具之一,可以测试网络连接是否正常,本文主要来和大家探讨Ping命令的工作原理和用法,需要的可以参考一下
    2023-06-06
  • python反转(逆序)字符串的6种方法详细

    python反转(逆序)字符串的6种方法详细

    这篇文章主要介绍了python反转(逆序)字符串的6种方法详细,需要的朋友可以参考下
    2021-04-04
  • Python3 shelve对象持久存储原理详解

    Python3 shelve对象持久存储原理详解

    这篇文章主要介绍了Python3 shelve对象持久存储原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python字符串模糊匹配工具TheFuzz的用法详解

    Python字符串模糊匹配工具TheFuzz的用法详解

    在处理文本数据时,常常需要进行模糊字符串匹配来找到相似的字符串,Python的TheFuzz库提供了强大的方法用于解决这类问题,本文将深入介绍TheFuzz库,探讨其基本概念、常用方法和示例代码,需要的朋友可以参考下
    2023-12-12
  • Python处理不同接口间参数依赖的方法总结

    Python处理不同接口间参数依赖的方法总结

    这篇文章主要为大家详细介绍了如何使用Python编写接口自动化测试,以有效地处理不同接口之间的参数依赖,并提供丰富的示例代码,希望对大家有所帮助
    2024-01-01
  • Python中有哪些关键字及关键字的用法

    Python中有哪些关键字及关键字的用法

    这篇文章主要介绍了Python中有哪些关键字及关键字的用法,分享python中常用的关键字,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Python字典循环添加一键多值的用法实例

    Python字典循环添加一键多值的用法实例

    今天小编就为大家分享一篇Python字典循环添加一键多值的用法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python使用句柄控制windows窗口的两种方法

    python使用句柄控制windows窗口的两种方法

    本文主要介绍了python使用句柄控制windows窗口的两种方法,实现窗口的最小化,还原,最大化,关闭操作,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Python multiprocessing.value实现多进程数据共享的示例

    Python multiprocessing.value实现多进程数据共享的示例

    本文介绍了Python中的multiprocessing.value,通过示例代码展示了如何使用这个类实现多进程数据共享,以及使用场景和注意事项等内容,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • Python遍历目录中的所有文件的方法

    Python遍历目录中的所有文件的方法

    Pyhton中我们一般使用os.walk生成器来获取文件夹中的所有文件,这里我们就来详细看一下Python遍历目录中的所有文件的方法,包括一个进阶的利用fnmatch模块进行匹配的方法:
    2016-07-07

最新评论