如何实现移除文件首尾指定行数并写入新文件的Python函数?
完善文件内容截断函数的实现
看起来你已经有了一个不错的开头,我来帮你补全这个truncate_file函数,实现去掉开头和末尾指定行数的功能,同时优化代码的安全性和可读性。
首先,先看一下完整的实现代码,包含输入验证、安全的文件操作和边界情况处理:
def truncate_file(file1, file2): print("\n*** Truncating file copy ***\n") # 获取开头要省略的行数,做输入验证 while True: try: omit_from_start = int(input("Omit how many lines from the start...")) if omit_from_start >= 0: break print("请输入非负整数哦!") except ValueError: print("请输入有效的整数格式!") # 获取末尾要省略的行数,同样做输入验证 while True: try: omit_from_end = int(input("Omit how many lines from the end...")) if omit_from_end >= 0: break print("请输入非负整数哦!") except ValueError: print("请输入有效的整数格式!") # 使用with语句自动管理文件,不用手动close,避免资源泄漏 with open(file1, "r") as infile, open(file2, "w") as outfile: # 把所有行读到列表里,方便处理末尾的行 all_lines = infile.readlines() total_lines = len(all_lines) # 计算要保留的行的范围 start_pos = omit_from_start end_pos = total_lines - omit_from_end # 处理边界情况:如果要省略的行数超过文件总行数,输出空文件 if start_pos >= end_pos: print("警告:要省略的行数总和超过了文件总行数,输出文件将为空。") return # 把保留的行写入新文件 outfile.writelines(all_lines[start_pos:end_pos]) print(f"搞定!处理后的内容已经写入{file2}啦") # 测试用例(实际使用时可以直接调用函数传入参数) # truncate_file("omit_lines_test.txt", "truncated_file.txt")
关键细节说明
- 安全的文件操作:用
with语句打开文件,它会自动在代码块结束后关闭文件,就算中间出现错误也不会漏掉关闭操作,比手动调用close()靠谱多了。 - 输入验证:加了循环和
try-except判断,确保用户输入的是有效的非负整数,避免因为输入错误导致程序崩溃。 - 末尾行处理:先把所有行读到列表里,通过切片直接截取需要保留的部分,这种方式对于中小文件来说简单又直观。
- 边界情况处理:如果开头要省略的行数加上末尾的行数超过了文件总行数,会给出警告并且不写入内容,避免产生混乱的结果。
针对大文件的优化方案
如果你的文件特别大,一次性把所有行读到内存里会占用太多资源,那可以用下面这个版本,分两次遍历文件:第一次统计总行数,第二次只写入需要保留的行:
def truncate_large_file(file1, file2): print("\n*** Truncating large file copy ***\n") # 输入验证部分和上面一样 while True: try: omit_from_start = int(input("Omit how many lines from the start...")) if omit_from_start >= 0: break print("请输入非负整数哦!") except ValueError: print("请输入有效的整数格式!") while True: try: omit_from_end = int(input("Omit how many lines from the end...")) if omit_from_end >= 0: break print("请输入非负整数哦!") except ValueError: print("请输入有效的整数格式!") # 第一步:先统计文件的总行数 total_lines = 0 with open(file1, "r") as infile: for _ in infile: total_lines += 1 # 计算要保留的最后一行的位置 last_keep_line = total_lines - omit_from_end if omit_from_start >= last_keep_line: print("警告:要省略的行数总和超过了文件总行数,输出文件将为空。") with open(file2, "w"): # 创建一个空文件 pass return # 第二步:重新遍历文件,只写入需要保留的行 current_line_num = 0 with open(file1, "r") as infile, open(file2, "w") as outfile: for line in infile: current_line_num += 1 # 判断当前行是否在要保留的范围内 if omit_from_start < current_line_num <= last_keep_line: outfile.write(line) print(f"搞定!处理后的内容已经写入{file2}啦")
这个版本不会一次性加载所有内容到内存,适合处理几百MB甚至更大的文件。
内容的提问来源于stack exchange,提问作者Jim421616
相关产品推荐
相关产品推荐

