You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现移除文件首尾指定行数并写入新文件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:38:29