Python3 OS 文件/目录方法:用代码管理你的文件系统
我是陈默,一个正拼命上岸的码农。
你有没有手动重命名过 100 个文件?
一个一个改,改到手酸。改完发现有个错别字,再来一遍。
这种体力活,Python 几行代码就搞定了。os 模块就是你和操作系统之间的翻译官——你用 Python 说话,它帮你操作文件和目录。
今天我们来聊聊 Python 里最常用的文件和目录操作。
1. 先导入 os 模块
import os
就这么简单。os 是 Python 内置模块,不用安装。
2. 路径操作:找到文件在哪
获取当前工作目录
print(os.getcwd())# 输出: /Users/陈默/projects
getcwd() = get current working directory。你在哪个目录运行 Python,它就返回哪个目录。
拼接路径
# ✅ 推荐写法:跨平台兼容path = os.path.join("documents", "work", "report.txt")print(path) # Mac输出: documents/work/report.txt# Windows输出: documents\work\report.txt# ❌ 不推荐:硬编码斜杠path = "documents/work/report.txt"# Windows 上可能出问题
永远用 os.path.join() 拼路径。 Mac 用 /,Windows 用 \,join() 帮你处理。
获取文件名和目录名
path = "/Users/陈默/projects/main.py"print(os.path.basename(path)) # 输出: main.py(文件名)print(os.path.dirname(path)) # 输出: /Users/陈默/projects(目录名)
分离文件名和扩展名
filename = "report.pdf"name, ext = os.path.splitext(filename)print(name) # 输出: reportprint(ext) # 输出: .pdf
判断路径是否存在
print(os.path.exists("/Users/陈默")) # 输出: Trueprint(os.path.exists("/Users/不存在的人")) # 输出: False# 判断是文件还是目录print(os.path.isfile("main.py")) # 输出: Trueprint(os.path.isdir("main.py")) # 输出: Falseprint(os.path.isdir("documents")) # 输出: True
3. 目录操作:创建、删除、遍历
创建目录
# 创建一级目录os.mkdir("new_folder")# 创建多级目录(中间的目录不存在也没关系)os.makedirs("a/b/c", exist_ok=True)
exist_ok=True 表示目录已存在时不报错。加上它,省得每次判断。
删除目录
# 删除空目录os.rmdir("empty_folder")# 删除多级空目录os.removedirs("a/b/c")
注意:只能删空目录。目录里有东西会报错。
列出目录内容
# 列出当前目录的所有文件和文件夹items = os.listdir(".")print(items)# 输出: ['main.py', 'data', 'config.json', 'test.py']# 只列出文件files = [f for f in os.listdir(".") if os.path.isfile(f)]print(files)# 输出: ['main.py', 'config.json', 'test.py']# 只列出目录dirs = [d for d in os.listdir(".") if os.path.isdir(d)]print(dirs)# 输出: ['data']
遍历目录树
# 递归遍历所有子目录for root, dirs, files in os.walk("."): print(f"目录:{root}")for f in files: print(f" 文件:{f}")
os.walk() 是处理嵌套目录的利器。它会一层一层走进去,把每一层的目录和文件都给你。
4. 文件操作:重命名、删除、复制
重命名
# 重命名文件os.rename("old_name.txt", "new_name.txt")# 移动文件(重命名到新路径)os.rename("report.txt", "archive/report.txt")
删除文件
os.remove("不需要的文件.txt")
删除前最好确认文件存在:
if os.path.exists("不需要的文件.txt"): os.remove("不需要的文件.txt")else: print("文件不存在")
复制和移动
复制文件需要 shutil 模块(不是 os,但配合用):
import shutil# 复制文件shutil.copy("source.txt", "backup/source.txt")# 复制整个目录shutil.copytree("project", "project_backup")# 移动文件shutil.move("temp.txt", "archive/temp.txt")# 删除整个目录(包括里面的所有文件)shutil.rmtree("要删除的目录")
shutil 是 os 的最佳搭档。目录级别的操作,用 shutil 更方便。
5. 获取文件信息
文件大小
size = os.path.getsize("main.py")print(f"文件大小:{size} 字节")# 格式化为可读大小defformat_size(size_bytes):if size_bytes < 1024:returnf"{size_bytes} B"elif size_bytes < 1024 * 1024:returnf"{size_bytes / 1024:.1f} KB"else:returnf"{size_bytes / (1024 * 1024):.1f} MB"print(format_size(size))
修改时间
import timemtime = os.path.getmtime("main.py")readable = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(mtime))print(f"最后修改:{readable}")# 输出: 最后修改:2026-03-28 15:30:00
绝对路径
print(os.path.abspath("main.py"))# 输出: /Users/陈默/projects/main.py
6. 环境信息:你的电脑知道什么
系统信息
# 操作系统名称print(os.name) # Mac/Linux输出: posix,Windows输出: nt# 环境变量print(os.environ.get("HOME")) # 输出: /Users/陈默print(os.environ.get("PATH")) # 输出: /usr/bin:/usr/local/bin:...# 设置环境变量(当前进程有效)os.environ["MY_VAR"] = "hello"print(os.environ.get("MY_VAR")) # 输出: hello
执行系统命令
# 运行系统命令result = os.popen("echo 你好").read()print(result) # 输出: 你好
但更推荐用 subprocess 模块:
import subprocessresult = subprocess.run(["ls", "-la"], capture_output=True, text=True)print(result.stdout)
7. 实战一:批量重命名文件
import osdefbatch_rename(folder, prefix="file"):"""给文件夹里的所有文件加前缀"""for i, filename in enumerate(os.listdir(folder), 1): old_path = os.path.join(folder, filename)if os.path.isfile(old_path): name, ext = os.path.splitext(filename) new_name = f"{prefix}_{i:03d}{ext}" new_path = os.path.join(folder, new_name) os.rename(old_path, new_path) print(f"{filename} → {new_name}")# 使用:把 photos 文件夹里的文件重命名为 photo_001.jpg, photo_002.jpg...batch_rename("photos", prefix="photo")
8. 实战二:找出最大的文件
import osdeffind_largest_files(folder, n=5):"""找出文件夹里最大的 n 个文件""" files = []for root, dirs, filenames in os.walk(folder):for f in filenames: path = os.path.join(root, f) size = os.path.getsize(path) files.append((path, size))# 按大小排序,取前 n 个 files.sort(key=lambda x: x[1], reverse=True) print(f"最大的 {n} 个文件:")for path, size in files[:n]:if size < 1024 * 1024: size_str = f"{size / 1024:.1f} KB"else: size_str = f"{size / (1024 * 1024):.1f} MB" print(f" {size_str:>10}{path}")find_largest_files(".", n=10)
9. 实战三:目录清理工具
import osimport shutilfrom datetime import datetime, timedeltadefcleanup_old_files(folder, days=30):"""删除超过 N 天的文件""" cutoff = datetime.now() - timedelta(days=days) count = 0for root, dirs, files in os.walk(folder):for f in files: path = os.path.join(root, f) mtime = datetime.fromtimestamp(os.path.getmtime(path))if mtime < cutoff: print(f"删除:{path}({mtime.strftime('%Y-%m-%d')})") os.remove(path) count += 1 print(f"\n共删除 {count} 个超过 {days} 天的文件")# 删除 temp 目录里超过 7 天的文件cleanup_old_files("temp", days=7)
最后
os 模块是你和文件系统之间的桥梁。处理文件、管理目录、批量操作——这些日常任务,Python 都能自动化。
记住三件事:
- 拼路径永远用
os.path.join(),别硬编码斜杠
我的建议:
找一个你经常手动操作的文件夹——比如下载目录、截图目录。写一个脚本自动清理或整理它。第一次可能要花半小时写代码,但以后每次都省几分钟。
程序员的价值,就是把重复的事交给代码。
今天就到这里。
我是陈默,我们下期再见。
如果你觉得这篇文章有帮助,欢迎关注我。我会持续分享 Python 学习的干货。