文件操作是 Python 最实用的技能之一——不管你是学生还是用 Python 做数据处理的打工人,迟早要和文件打交道。
这 5 个技巧,能让你告别手动操作,把重复劳动交给脚本。
1. 用 zipfile 处理压缩文件
做数据分析的朋友特别需要知道这个,能省掉很多手动处理的时间。
童生会这样写:
import subprocess
subprocess.run(['unzip', 'archive.zip', '-d', 'output/'])
状元会这样写:
import zipfile
# 解压
with zipfile.ZipFile('archive.zip', 'r') as zf:
zf.extractall('output/')
print(zf.namelist())
# 创建压缩包
with zipfile.ZipFile('result.zip', 'w') as zf:
zf.writestr('info.txt', 'hello world')
zipfile 是 Python 标准库的 ZIP 处理模块,跨平台可用,不依赖外部命令。writestr 可以直接写入字符串内容,无需先创建文件。
2. 用 csv 模块处理 CSV 文件
有次代码评审被同事用这招秀了一脸,回去立马学会了。十年了还记得那个表情。
很多人会这样写:
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. 用 open 的 encoding 参数避免乱码
第一次看到这个写法的时候,我盯着屏幕愣了三秒。然后默默改了自己之前的代码。
菜鸟写法:
with open('chinese.txt') as f:
content = f.read() # Windows 可能用 GBK 解码,Linux 用 UTF-8
大神写法:
with open('chinese.txt', encoding='utf-8') as f:
content = f.read()
# 或用 errors 参数处理解码错误
with open('messy.txt', encoding='utf-8', errors='replace') as f:
content = f.read()
不指定 encoding 时,open() 使用系统默认编码(Windows 是 GBK),跨平台时容易乱码。始终显式指定 encoding='utf-8' 是好习惯。
4. 用 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 not d.startswith('.')]
os.walk 自动递归遍历目录树,返回 (目录路径, 子目录列表, 文件列表) 三元组。修改 dirs[:] 可以动态控制遍历范围,如跳过隐藏目录。
5. 用 hashlib 计算文件哈希
我见过太多人在这个地方绕弯路了。不是你笨,是没人告诉你有捷径。
一般写法:
import hashlib
with open('large_file.bin', 'rb') as f:
content = f.read() # 大文件会撑爆内存
md5 = hashlib.md5(content).hexdigest()
高阶写法:
import hashlib
def file_hash(path, algo='sha256', chunk_size=8192):
h = hashlib.new(algo)
with open(path, 'rb') as f:
while chunk := f.read(chunk_size):
h.update(chunk)
return h.hexdigest()
print(file_hash('large_file.bin'))
分块读取文件并逐块更新哈希,内存占用恒定,可以处理任意大小的文件。用了海象运算符 := 简化了循环读取的写法。
以上就是今天的 5 个技巧。不管你是刚入门还是想提效,总有一个能帮上忙。
觉得有用就转给你身边正在学 Python 的朋友。
下期预告:函数技巧专场
关于作者
写了 10 年 Python,赶上了机器学习的热潮,又撞上了大模型的浪头,每次以为学明白了,行业又变了一次。不是什么大神,就是一个在互联网里摸爬滚打、把坑踩了个遍的老工人。还在写代码,还在折腾,还在想明白这个时代到底发生了什么。把自己踩过的坑、走过的弯路、看过的热闹,说给还在路上的人听。
关注「鲁叶的Python」,一起穿越迷茫期。