更新时间:2025-09-21 18:20点击:51
处理大文件时,逐行读取可以有效避免内存溢出:
with open('largefile.txt', 'r') as file:
for line in file:
print(line, end='')
Python提供了一些模块来简化文件操作,如os和shutil:
os模块:提供文件和目录操作功能。shutil模块:提供文件和目录复制、移动、删除等功能。使用os.path模块可以方便地处理文件路径:
import os
# 获取文件名
filename = os.path.basename('path/to/file.txt')
print(filename) # 输出:file.txt
# 获取目录名
dirname = os.path.dirname('path/to/file.txt')
print(dirname) # 输出:path/to
# 判断文件是否存在
if os.path.exists('path/to/file.txt'):
print('文件存在')
else:
print('文件不存在')
使用cryptography库可以实现文件的加密和解密:
from cryptography.fernet import Fernet
# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)
# 加密文件
with open('example.txt', 'rb') as file:
original_data = file.read()
encrypted_data = cipher_suite.encrypt(original_data)
# 解密文件
with open('example.txt', 'wb') as file:
file.write(cipher_suite.decrypt(encrypted_data))
以下是一个批量重命名文件的实战案例:
import os # 原始文件名格式:20230928_01.txt # 目标文件名格式:year_month_day_001.txt for filename in os.listdir('.'): if filename.startswith('2023'): year_month_day = filename[0:10] index = filename[11:-4] new_filename = f"{year_month_day}_{index}.txt" os.rename(filename, new_filename)
三、文件“周边操作”:重命名、删除、目录管理除了读写,我们还需要对文件/目录进行“增删改查”。这需要借助os模块(操作系统接口),它能帮你完成更底层的操作。3.1 重命名与删除:文件的“改名”与“删除”os.rename(old_path, new_path):重命名文件/目录;os.remove(file_path):删除文件(注意:无法恢复!);os.rmdir(dir_path):删除空目录(非空目录会报错)。示例:清理临时文件import os# 重命名文件:将"temp_log.txt"改为"202310_log.txt"os.rename("temp_log.txt", "202310_log.txt")# 删除无用的临时文件(确保文件存在,否则会报错)if os.path.exists("trash.txt"): # 检查文件是否存在os.remove("trash.txt")print("临时文件已删除")else:print("文件不存在,无需删除")# 删除空目录(假设"empty_dir"是空的)if os.path.isdir("empty_dir") and not os.listdir("empty_dir"): # 检查是否为空目录os.rmdir("empty_dir")print("空目录已删除")3.2 创建与遍历目录:“新建文件夹”的高级玩法os.mkdir(dir_path):创建单级目录(父目录必须存在,否则报错);os.makedirs(dir_path, exist_ok=True):递归创建多级目录(exist_ok=True表示目录存在时不报错);os.listdir(dir_path):获取目录下所有文件/子目录的名称列表;os.path模块:处理路径的“神器”(如os.path.join()拼接路径,os.path.splitext()分离文件名和后缀)。示例:创建分类文件夹并整理文件import osfrom shutil import move # 用于移动文件(需导入shutil模块)# 目标:将下载目录中的文件按类型分类到"图片""文档""其他"文件夹download_dir = "./downloads"target_dirs = {"图片": [".jpg", ".png", ".gif"],"文档": [".docx", ".pdf", ".txt"],"其他": []}# 1. 递归创建目标目录(如果不存在)for dir_name in target_dirs.keys():target_path = os.path.join(download_dir, dir_name)os.makedirs(target_path, exist_ok=True) # exist_ok=True避免重复创建报错# 2. 遍历下载目录中的文件for filename in os.listdir(download_dir):file_path = os.path.join(download_dir, filename)# 跳过目录,只处理文件if os.path.isfile(file_path):# 获取文件后缀(转小写,兼容.JPG等情况)ext = os.path.splitext(filename)[1].lower()# 判断分类for dir_name, exts in target_dirs.items():if ext in exts:target_path = os.path.join(download_dir, dir_name, filename)move(file_path, target_path) # 移动文件到目标目录print(f"已将 {filename} 移动到 {dir_name} 文件夹")breakelse:# 未匹配到类型,归为"其他"target_path = os.path.join(download_dir, "其他", filename)move(file_path, target_path)print(f"已将 {filename} 移动到 其他 文件夹")四、实战示例:三个场景搞定文件操作前面的知识需要实战检验,这里给出三个高频场景的解决方案。示例1:目录清洗——删除30天前的日志文件运维中常需要定期清理旧日志,避免磁盘爆炸。import osimport timefrom datetime import datetimelog_dir = "./logs"max_age_days = 30 # 保留最近30天的日志# 遍历日志目录下的所有文件for filename in os.listdir(log_dir):file_path = os.path.join(log_dir, filename)if os.path.isfile(file_path):# 获取文件最后修改时间(时间戳)modify_time = os.path.getmtime(file_path)# 计算文件年龄(天)current_time = time.time()age_days = (current_time - modify_time) / (24 * 3600)# 如果超过30天,删除文件if age_days > max_age_days:os.remove(file_path)print(f"已删除过期日志:{filename}(最后修改于{datetime.fromtimestamp(modify_time)})")示例2:批量命名——给百张照片添加时间前缀手机导出的照片常是“IMG_1234.jpg”,想改成“2023-10-01_IMG_1234.jpg”。import osfrom datetime import datetimephoto_dir = "./photos"# 遍历目录下所有图片文件for filename in os.listdir(photo_dir):# 只处理.jpg和.png文件if filename.lower().endswith((".jpg", ".png")):file_path = os.path.join(photo_dir, filename)# 获取文件创建时间(或修改时间,根据需求调整)create_time = os.path.getctime(file_path)time_str = datetime.fromtimestamp(create_time).strftime("%Y-%m-%d")# 格式化为"2023-10-01"# 新文件名:时间前缀+原文件名new_filename = f"{time_str}_{filename}"new_path = os.path.join(photo_dir, new_filename)# 重命名(注意:如果新文件名已存在会覆盖,需添加防重逻辑!)os.rename(file_path, new_path)print(f"已重命名:{filename} → {new_filename}")示例3:检测同名文件夹——避免数据覆盖部署项目时,可能误操作创建同名文件夹导致数据丢失,需要提前检测。import osdef check_duplicate_dirs(target_dir):"""检测目标目录下是否有同名文件夹(不区分大小写)"""dir_names = [d.lower() for d in os.listdir(target_dir) if os.path.isdir(os.path.join(target_dir, d))]# 统计名称出现次数(不区分大小写)name_counts = {}for name in dir_names:name_counts[name] = name_counts.get(name, 0) + 1# 找出重复的名称duplicates = [name for name, count in name_counts.items() if count > 1]if duplicates:print(f"警告:以下文件夹名称重复(不区分大小写):{duplicates}")return Falseelse:print("无同名文件夹,可安全操作")return True# 测试:假设target_dir下有"Logs"和"logs"两个文件夹check_duplicate_dirs("./target_dir") # 输出:警告:以下文件夹名称重复(不区分大小写):['logs']结语:文件操作是程序员的“基础功”,但绝不是“简单活”从打开一个文件到批量整理目录,Python用简洁的语法封装了复杂的系统操作。但要注意:文件操作不可逆(删除后无法恢复),一定要先备份或做好条件判断(如os.path.exists())。