每次看到有人用最原始的方式读写文件,我就想把这篇文章甩过去。这 5 个文件操作技巧,学会了能省不少事。
1. 用 os.walk 递归遍历目录
你是不是还在手动递归 :
import os
def list_files(path):
for item in os.listdir(path):
full = os.path.join(path, item)
if os.path.isdir(full):
list_files(full)
else:
print(full)
换这一招,干净利落 :
import os
for root, dirs, files in os.walk('.'):
for f in files:
if f.endswith('.py'):
print(os.path.join(root, f))
# 可以修改 dirs 来跳过目录
dirs[:] = [d for d in dirs if d != '__pycache__']
os.walk 自动递归遍历目录树,返回 (目录路径, 子目录列表, 文件列表) 三元组。修改 dirs[:] 可以动态控制遍历范围,如跳过隐藏目录。
2. 用 csv 模块处理 CSV 文件
自己 split 逗号?遇到引号里的逗号就崩了:
with open('data.csv') as f:
for line in f:
fields = line.strip().split(',')
# 如果字段包含逗号就出错了!
标准库给你安排得明明白白:
import csv
with open('data.csv', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['name'], row['age'])
csv 模块正确处理引号、逗号转义等边界情况。DictReader 按列名访问比索引更可读。记得加 newline='' 避免空行问题。
3. 用 glob 批量匹配文件
别再写循环 + endswith 了:
import os
py_files = []
for f in os.listdir('.'):
if f.endswith('.py'):
py_files.append(f)
一行通配符搞定:
from pathlib import Path
py_files = list(Path('.').glob('*.py'))
print(py_files)
# 递归查找所有子目录
all_py = list(Path('.').rglob('*.py'))
glob 支持通配符匹配文件,rglob 递归搜索子目录。比 os.listdir + 手动过滤更简洁,支持 **, *, ? 等模式。
4. 用 configparser 读写 INI 配置
手撸配置解析器,费力不讨好:
# 手动解析配置文件
config = {}
with open('config.ini') as f:
for line in f:
if '=' in line:
key, val = line.strip().split('=')
config[key.strip()] = val.strip()
专为 INI 而生的模块不香吗:
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
# 读取
host = config.get('database', 'host', fallback='localhost')
port = config.getint('database', 'port', fallback=3306)
print(f'{host}:{port}')
configparser 正确处理 INI 格式的 section、注释、多行值等,getint/getfloat/getboolean 自动类型转换,fallback 提供默认值。
5. 用 Path.stat() 获取文件信息
东一个 getsize,西一个 getmtime:
import os
size = os.path.getsize('file.txt')
mtime = os.path.getmtime('file.txt')
import time
print(time.ctime(mtime))
一次 stat,全部拿走:
from pathlib import Path
from datetime import datetime
p = Path('file.txt')
stat = p.stat()
print(f'Size: {stat.st_size} bytes')
print(f'Modified: {datetime.fromtimestamp(stat.st_mtime)}')
print(f'Exists: {p.exists()}')
print(f'Is file: {p.is_file()}')
Path.stat() 返回文件的所有元数据(大小、修改时间、权限等),配合 datetime 格式化时间戳。Path 的 exists/is_file/is_dir 等方法也很实用。
速查表
| 场景 | 别这样写 | 试试这样 |
|---|
| 递归遍历目录 | os.listdir + 手动递归 | os.walk 自动遍历 |
| 处理 CSV 文件 | line.strip().split(',') | csv.DictReader |
| 批量匹配文件 | os.listdir + endswith | Path.glob('*.py') |
| 读写 INI 配置 | 手动 split 解析 | configparser |
| 获取文件信息 | os.path.getsize + getmtime | Path.stat() |
以上就是文件操作的 5 个实用技巧,每个都是我在实际项目中踩过坑才总结出来的。挑一个今天就用上,慢慢积累,你的代码质量会肉眼可见地提升。
评论区聊聊:这 5 个技巧里哪个你之前不知道?
下期预告:函数技巧专场
关于作者
写了 10 年 Python,赶上了机器学习的热潮,又撞上了大模型的浪头,每次以为学明白了,行业又变了一次。把自己踩过的坑、走过的弯路、看过的热闹,说给还在路上的人听。
关注「鲁叶的Python」,一起穿越迷茫期。