python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python os模块操作文件

Python文件操作之os模块文件与目录操作全攻略

作者:星河耀银海

本文将带大家全面掌握os模块的核心操作,包括创建删除目录、重命名文件、遍历目录树等,学会用os.listdir、os.walk和os.stat高效管理文件,告别手动重复劳动,提升你的开发效率

一、开篇:不止于读写——文件和目录的管理

open()只能读写文件内容。但文件还有很多其他操作:创建目录、删除文件、重命名、检查是否存在、遍历目录树……这些都要靠os模块。

os模块提供了操作系统级别的文件和目录操作:

import os

# os模块的三大类功能:
# 1. 目录操作:创建、删除、遍历
# 2. 文件操作:删除、重命名、检查属性
# 3. 进程相关:获取当前目录、切换目录、执行系统命令

二、目录操作

2.1 创建和删除目录

import os

# mkdir() —— 创建单个目录
os.mkdir("new_folder")           # 创建 new_folder
# os.mkdir("a/b/c")              # FileNotFoundError —— 父目录不存在
os.mkdir("new_folder/sub")       # 在已存在的目录下创建子目录

# makedirs() —— 递归创建多层目录
os.makedirs("a/b/c", exist_ok=True)  # 一次性创建 a/b/c 三层
# exist_ok=True:目录已存在时不报错(Python 3.2+)

# rmdir() —— 删除单个空目录
os.rmdir("new_folder/sub")       # 删除空目录
# os.rmdir("new_folder")         # OSError —— 目录不为空

# removedirs() —— 递归删除空目录
os.removedirs("a/b/c")           # 从内向外删除空目录

# 💡 推荐使用exist_ok=True——省去判断目录是否存在的麻烦

2.2 遍历目录

# listdir() —— 列出目录内容
entries = os.listdir(".")
print(f"当前目录内容: {entries}")

# 区分文件和目录
for entry in os.listdir("."):
    path = os.path.join(".", entry)
    if os.path.isfile(path):
        print(f"  📄 {entry}")
    elif os.path.isdir(path):
        print(f"  📁 {entry}/")

# scandir() —— 更高效的目录遍历(返回迭代器,含类型信息)
with os.scandir(".") as entries:
    for entry in entries:
        if entry.is_file():
            print(f"  文件: {entry.name} ({entry.stat().st_size}字节)")
        elif entry.is_dir():
            print(f"  目录: {entry.name}/")

# walk() —— 递归遍历整个目录树
for root, dirs, files in os.walk("."):
    # root: 当前目录路径
    # dirs: 当前目录下的子目录列表
    # files: 当前目录下的文件列表
    level = root.replace(".", "").count(os.sep)
    indent = "  " * level
    print(f"{indent}📁 {os.path.basename(root)}/")
    for file in files:
        print(f"{indent}  📄 {file}")

三、文件操作

3.1 删除和重命名

import os

# remove() / unlink() —— 删除文件
with open("temp.txt", "w") as f:
    f.write("临时文件")
os.remove("temp.txt")  # 或 os.unlink("temp.txt")

# rename() —— 重命名文件或目录
with open("old.txt", "w") as f:
    f.write("old")
os.rename("old.txt", "new.txt")
os.rename("new.txt", "renamed.txt")

# replace() —— 替换文件(跨文件系统安全)
# os.replace("renamed.txt", "final.txt")

# ⚠️ rename()在不同文件系统间可能失败
# replace()更安全——如果在不同磁盘上也能工作

# rmdir vs remove 的区别:
# os.rmdir() —— 删除空目录
# os.remove() —— 删除文件

3.2 获取文件信息

import os
import time

# 创建测试文件
with open("info_test.txt", "w") as f:
    f.write("测试文件信息")

# stat() —— 获取文件详细信息
stat_info = os.stat("info_test.txt")
print(f"文件大小: {stat_info.st_size}字节")
print(f"创建时间: {time.ctime(stat_info.st_ctime)}")
print(f"修改时间: {time.ctime(stat_info.st_mtime)}")
print(f"访问时间: {time.ctime(stat_info.st_atime)}")
print(f"inode号: {stat_info.st_ino}")

# 便捷的判断函数
print(f"存在: {os.path.exists('info_test.txt')}")
print(f"是文件: {os.path.isfile('info_test.txt')}")
print(f"是目录: {os.path.isdir('info_test.txt')}")
print(f"是符号链接: {os.path.islink('info_test.txt')}")
print(f"是绝对路径: {os.path.isabs('info_test.txt')}")

# access() —— 检查访问权限
print(f"可读: {os.access('info_test.txt', os.R_OK)}")
print(f"可写: {os.access('info_test.txt', os.W_OK)}")
print(f"可执行: {os.access('info_test.txt', os.X_OK)}")

os.remove("info_test.txt")

四、工作目录和环境

import os

# getcwd() —— 获取当前工作目录
cwd = os.getcwd()
print(f"当前目录: {cwd}")

# chdir() —— 切换工作目录
original = os.getcwd()
os.chdir("..")          # 到上级目录
print(f"上级目录: {os.getcwd()}")
os.chdir(original)      # 恢复

# 环境变量
print(f"PATH: {os.environ.get('PATH', '')[:100]}...")
print(f"HOME: {os.environ.get('HOME', os.environ.get('USERPROFILE', ''))}")

# 执行系统命令
# os.system("dir")      # Windows
# os.system("ls -la")   # Linux/Mac
# 或者用subprocess(更推荐)
import subprocess
# result = subprocess.run(["ls", "-la"], capture_output=True, text=True)

五、实战:文件管理工具

import os
import shutil

def organize_files_by_extension(directory):
    """按扩展名整理文件——将同类型文件放入对应文件夹"""
    if not os.path.exists(directory):
        print(f"目录不存在: {directory}")
        return

    organized = 0
    for filename in os.listdir(directory):
        filepath = os.path.join(directory, filename)

        # 跳过目录
        if os.path.isdir(filepath):
            continue

        # 获取扩展名
        _, ext = os.path.splitext(filename)
        ext = ext.lower().lstrip(".") or "no_extension"

        # 创建目标目录
        target_dir = os.path.join(directory, ext)
        os.makedirs(target_dir, exist_ok=True)

        # 移动文件
        target_path = os.path.join(target_dir, filename)
        shutil.move(filepath, target_path)
        organized += 1

    print(f"整理了{organized}个文件到{os.path.basename(directory)}")

def cleanup_empty_dirs(directory):
    """清理空目录"""
    removed = 0
    for root, dirs, files in os.walk(directory, topdown=False):
        for d in dirs:
            dirpath = os.path.join(root, d)
            try:
                os.rmdir(dirpath)  # 只删除空目录
                removed += 1
                print(f"  删除空目录: {dirpath}")
            except OSError:
                pass  # 目录非空,跳过
    print(f"共删除{removed}个空目录")

# 使用
# organize_files_by_extension("./downloads")
# cleanup_empty_dirs("./downloads")

六、总结

os模块是Python与操作系统交互的桥梁。文件读写靠open(),文件和目录的管理靠os。

常用操作速查:

操作函数
创建目录os.mkdir(), os.makedirs()
删除文件os.remove()
删除空目录os.rmdir()
重命名os.rename()
遍历目录os.listdir(), os.scandir(), os.walk()
检查是否存在os.path.exists()
获取文件信息os.stat()
当前目录os.getcwd()

到此这篇关于Python文件操作之os模块文件与目录操作全攻略的文章就介绍到这了,更多相关Python os模块操作文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文