如何实现通用Python文件复制:跳过首尾各两行并处理行内容
改造后的通用函数
原代码存在三个核心问题:硬编码行号无法适配不同文件、line_nr == 53 and line_nr == 54逻辑永远不成立、输出文件未用安全方式管理。以下提供两种改造方案,分别适配小文件和超大文件场景:
方案一:小文件场景(直观高效)
直接读取所有行到内存,通过切片快速筛选需要保留的内容,代码简洁易维护:
def copy_file(self, input_file, output_file): # 读取所有行并自动关闭文件 with open(input_file, 'r') as fp: lines = fp.readlines() # 处理行数不足4的情况(无有效内容可保留) if len(lines) <= 4: with open(output_file, 'w'): return # 跳过前2行和最后2行 target_lines = lines[2:-2] # 处理每行并写入目标文件 with open(output_file, 'w') as fout: for line in target_lines: # 按第一个空格分割,取后半部分;无空格则保留原行 parts = line.split(' ', 1) new_line = parts[-1] if len(parts) > 1 else line fout.write(new_line)
代码说明
- 用
with语句管理所有文件操作,确保文件自动关闭,避免资源泄漏 - 通过
lines[2:-2]切片直接获取需要保留的行,无需手动计数 - 兼容无空格的行,避免抛出索引错误
方案二:超大文件场景(内存友好)
如果文件体积过大(如GB级),避免一次性加载所有内容到内存,用队列缓存最后两行:
def copy_file(self, input_file, output_file): from collections import deque # 缓存最后2行的队列,超过长度自动弹出最早的元素 last_two = deque(maxlen=2) # 存储需要写入的内容(跳过前2行和最后2行) content = [] with open(input_file, 'r') as fp: # 跳过前2行 next(fp) next(fp) # 遍历剩余行,缓存最后2行,其余存入content for line in fp: if len(last_two) == 2: content.append(last_two.popleft()) last_two.append(line) # 处理并写入目标文件 with open(output_file, 'w') as fout: for line in content: parts = line.split(' ', 1) new_line = parts[-1] if len(parts) > 1 else line fout.write(new_line)
代码说明
- 用
deque限定缓存长度,始终只保留最后2行,内存占用恒定 - 遍历过程中提前筛选出需要写入的内容,无需二次遍历
测试验证
用你提供的测试文件内容:
line to be ignored line to be ignored Timestamp message Timestamp message line to be ignored line to be ignored
执行后输出文件内容为:
message message
完全符合预期。
内容的提问来源于stack exchange,提问作者Fábio Pires
相关产品推荐
相关产品推荐

