当前位置:首页>python>每天10分钟玩转Python基础篇 - 文件IO操作

每天10分钟玩转Python基础篇 - 文件IO操作

  • 2026-10-25 17:22:44
每天10分钟玩转Python基础篇 - 文件IO操作
PYTHON · 基础篇第10课2026.08

还在用 os.path 拼字符串路径?

给你的程序,接上文件

pathlib + shutil · 文件IO

📦 3 PARTS + CONCLUSION

👉 滑动

PART 01

通俗原理

Path 对象

PART 02

核心用法

7 个套路

PART 03

完整案例

批量整理

PART ///

写在最后

避坑自检

这是基础篇第10篇。前面我们学了变量、循环、字符串、列表字典集合、argparse、正则、datetime、异常处理。今天学一个让你的程序能「读写文件、整理目录」的技能:pathlib(文件路径处理)。

你有没有遇到过这些需求:把某个目录下的文件批量重命名、读一个配置文件、统计文件夹里所有文件的总字数、按后缀把文件分类整理?

这些全都要靠文件操作。Python 的 pathlib 模块就是干这个的——用面向对象的方式处理路径和文件,读写、遍历、重命名,一把搞定。

PART 01

通俗原理:Path 对象

以前处理路径,大家用的是字符串拼接("data/" + "logs/" + "app.log"),又丑又容易出错(Windows 和 Linux 的路径分隔符不一样)。

pathlib 的思路是:把路径当成一个对象(Path),路径拼接用 / 运算符,跨平台自动处理分隔符:

python

from pathlib importPath

p=Path("data")/"logs"/"app.log"

print(p)# data\logs\app.log(Windows 显示 \,Linux 显示 /)

Path("data") 创建一个路径对象,/ 运算符往下拼一层,代码干净又跨平台。

PART 02

核心用法:7 个套路

STEP 01

创建路径 + 拼接

python

from pathlib importPath

p=Path("data")/"logs"/"app.log"# 用 / 拼接

print(p)# data\logs\app.log

/ 运算符是 pathlib 最核心的语法糖,左边是 Path 对象,右边是字符串,拼出一个新路径。

STEP 02

取路径的各个部分

python

f=Path("report.txt")

print(f.name)# report.txt  文件名

print(f.stem)# report      不含后缀

print(f.suffix)# .txt        后缀

print(f.parent)# .           父目录

name、stem、suffix、parent 这几个属性,取路径的各个部分,不用再手动 split 了。

STEP 03

读写文件

python

out=Path("output")

out.mkdir(exist_ok=True)# 创建目录(已存在也不报错)

f=out/"hello.txt"

f.write_text("你好,飞污熊!",encoding="utf-8")# 写文件

print(f.read_text(encoding="utf-8"))# 读文件

write_text 写文本文件,read_text 读文本文件,比 open() 那一套简洁多了。mkdir(exist_ok=True) 创建目录,exist_ok=True 表示「已存在就不报错」。

STEP 04

判断存在和类型

python

print(f.exists())# True  是否存在

print(f.is_file())# True  是不是文件

print(out.is_dir())# True  是不是目录

这三个方法判断路径的存在和类型,做文件处理前先判断,避免踩坑。

STEP 05

遍历目录

python

foriteminout.iterdir():

print(item.name,"是文件?",item.is_file())

iterdir() 遍历目录下的所有内容,返回一个个 Path 对象。

STEP 06

用通配符匹配文件

python

forpyinout.glob("*.py"):

print(py.name)# 所有 .py 文件

glob("*.py") 用通配符匹配文件,* 匹配任意字符。想递归匹配所有子目录,用 "**/*.py"。

STEP 07

重命名文件

python

forfinout.glob("*.txt"):

new=f.with_suffix(".md")# 换后缀

f.rename(new)# 重命名

with_suffix 替换后缀,rename 重命名(也能用来移动文件)。

PART 03

完整案例:批量整理文件

把上面串起来,写一个「批量整理文件」小工具——把目录下所有 .txt 改成 .md,并统计总字数:

python

from pathlib importPath

out=Path("output")

out.mkdir(exist_ok=True)

fornamein["a.txt","b.txt","c.txt"]:

(out/name).write_text(f"这是 {name} 的内容",encoding="utf-8")

forfinout.glob("*.txt"):

f.rename(f.with_suffix(".md"))

print(f"重命名: {f.name} → {f.with_suffix('.md').name}")

total=0

forfinout.glob("*"):

iff.is_file():

total+=len(f.read_text(encoding="utf-8"))

print(f"总字数: {total}")

第一个循环:glob("*.txt") 找出所有 .txt,with_suffix(".md") 换成 .md 后缀,rename 完成重命名。第二个循环:遍历所有文件,read_text 读内容,len 统计字数,累加得到总数。这就是一个完整的文件整理脚本。

进阶

shutil:高级文件操作

pathlib 适合「路径处理 + 读写文件」,但如果要复制、移动、删除整个目录,shutil 更合适:

python

import shutil

shutil.copy("a.txt","backup/a.txt")# 复制文件

shutil.copytree("src","backup")# 复制整个目录树

shutil.move("a.txt","归档/a.txt")# 移动文件(也能重命名)

shutil.rmtree("临时目录")# 删除整个目录树(递归删除,慎用)

total,used,free=shutil.disk_usage(".")# 磁盘空间

print(f"剩余空间 {free / (1024**3):.1f} GB")

copy 复制单个文件;copy2 复制并保留元数据。 copytree 复制整个目录树;move 移动文件/目录。 rmtree 递归删除目录树(比 pathlib 的 rmdir 强,能删非空目录);disk_usage 查磁盘空间。

一句话区分:pathlib 管「路径 + 读写文件」,shutil 管「复制/移动/删除整个文件或目录」。日常写脚本时两个常常一起用。

避坑指南

4 个常见坑

with_suffix 不会自动修改文件的名称:f.with_suffix(".md") 只是返回一个新的 Path 对象(后缀变了),原文件没动。要真正改名,得用 rename()。

读文件要指定编码:中文文件要写 read_text(encoding="utf-8"),否则可能报错或乱码。写文件同理。

相对路径 vs 绝对路径:Path("data") 是相对路径,相对你运行脚本时所在的目录,不是脚本文件所在目录。要稳定定位,用绝对路径。

删除文件用 unlink():Path("x.txt").unlink() 删除文件(目录用 rmdir(),只能删空目录)。删除不可恢复,慎用。

自测检查

4 道题

① 能用 Path 创建路径并用 / 拼出一个文件路径吗?

② 能取出一个文件的 name、suffix、parent 吗?

③ 能用 write_text 写文件、read_text 读文件吗?

④ 能用 glob("*.py") 找出目录下所有 .py 文件并重命名吗?

这四题都能答上来,pathlib 你就入门了。文件操作是写正经程序绕不开的技能——日志、配置、数据,都要落地到文件,现在你有了趁手的工具。

既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。

点赞
在看
转发

THANKS FOR READING

最新文章

随机文章