删除含指定字符串的文本行遇PermissionError,求Pythonic解决方案
解决删除文件指定行时的PermissionError及优化实现
问题背景
需求是读取文本文件course work.txt,删除包含用户输入字符串的行。现有代码运行时抛出PermissionError: [WinError 5],临时文件生成正常,但无法覆盖原文件。
示例原文件内容:
Eric/20/SL/merc/3433 John/30/AU/BMW/2324 Tony/24/US/ford/4532 Leo/32/JP/Toyota/1344
输入Eric后期望的文件内容:
John/30/AU/BMW/2324 Tony/24/US/ford/4532 Leo/32/JP/Toyota/1344
错误原因
Windows系统下,文件被打开时会处于锁定状态。你的代码最外层已经用with语句打开了course work.txt,在这个上下文未结束时,又再次打开该文件并尝试用os.replace替换它,此时原文件的句柄还未释放,系统拒绝替换操作。
修复方案
调整代码结构,确保在执行文件替换前,原文件的所有句柄都已关闭:
import os # 先获取用户输入,避免提前占用文件句柄 word = input('Search: ') file_path = 'course work.txt' # 检查文件是否存在 try: with open(file_path, 'r') as original: content = original.read() except FileNotFoundError: print('文件不存在') exit() if word in content: print('用户输入的内容存在') confirmation = input('按回车键确认删除') if confirmation == '': # 此时外层文件句柄已关闭,重新打开处理行 with open(file_path, 'r') as original, open('temp.txt', 'w') as temporary: for line in original: # 直接判断字符串是否在行内,无需额外处理换行符 if word not in line: temporary.write(line) os.replace('temp.txt', file_path) else: print('未找到匹配的内容')
更Pythonic的实现
使用pathlib模块(Python3.4+)简化文件操作,同时优化逻辑,适配大文件场景:
from pathlib import Path word = input('Search: ') file_path = Path('course work.txt') # 先检查文件是否存在 if not file_path.exists(): print('文件不存在') exit() # 可选:提前检查是否有匹配内容,避免无意义的确认步骤 if word not in file_path.read_text(): print('未找到匹配的内容') exit() confirmation = input('按回车键确认删除') if confirmation != '': exit() # 用生成器表达式过滤行,高效处理大文件 temp_path = Path('temp.txt') with file_path.open('r') as f_in, temp_path.open('w') as f_out: f_out.writelines(line for line in f_in if word not in line) # 替换原文件 temp_path.replace(file_path)
额外优化点
- 增加文件不存在的异常处理,避免程序崩溃
- 用生成器表达式简化行过滤逻辑,更符合Python简洁风格
- 使用
pathlib统一文件路径操作,跨平台兼容性更好 - 移除冗余的
strip("\n"),保留原文件的换行格式,不影响字符串匹配
内容的提问来源于stack exchange,提问作者Janaka
相关产品推荐
相关产品推荐

