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

如何实现Python函数读取指定行数数字、求和打印并循环处理?

按指定行数批量读取文件数字并求和/计算平均值

需求说明

读取包含数百行数字的文件,每次读取指定行数的内容,对这些行的数字求和(或计算平均值)并打印,循环处理后续内容直到文件读取完毕。

原示例代码的问题

提供的示例代码存在几个关键问题,导致无法实现预期功能:

  • average_steps函数中重复打开文件,会重置文件指针,无法按顺序读取后续内容
  • 错误使用readlines(amount_of_days):该方法的参数是字节数而非行数,无法用来获取指定行数的内容
  • 未实现“每次读取指定行数”的逻辑,而是一次性读取了文件剩余的所有内容
  • 循环变量冗余:month_being_used在for循环中被自动赋值,又手动自增,属于逻辑错误

修正后的实现代码

def open_input_file():
    while True:
        name_of_file = input("请输入文件名: ")
        try:
            # 返回打开的文件对象,保持指针位置,后续可连续读取
            return open(name_of_file, 'r')
        except FileNotFoundError:
            print(f"未找到文件 {name_of_file},请检查文件名后重试。")

def process_batch_lines(file_obj, batch_size):
    """读取指定行数的内容,计算总和与平均值"""
    total = 0.0
    valid_line_count = 0
    for _ in range(batch_size):
        line = file_obj.readline()
        if not line:  # 读取到文件末尾,终止当前批量处理
            break
        stripped_line = line.strip()
        if not stripped_line:  # 跳过空行
            continue
        try:
            num = float(stripped_line)
            total += num
            valid_line_count += 1
        except ValueError:
            print(f"警告:行内容 '{stripped_line}' 不是有效数字,已跳过。")
    
    if valid_line_count == 0:
        return None, None  # 当前批量无有效数据
    average = total / valid_line_count
    return total, average

def main():
    file_wanted = open_input_file()
    # 示例:按月份天数作为批量大小处理数据
    month_list = ['一月', '二月', '三月', '四月',
                  '五月', '六月', '七月', '八月', '九月',
                  '十月', '十一月', '十二月']
    day_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    for month, batch_days in zip(month_list, day_list):
        total, average = process_batch_lines(file_wanted, batch_days)
        if total is None:
            print(f"处理{month}时已无更多数据,提前结束")
            break
        print(f"{month}: 总和 = {total:.2f},平均值 = {average:.2f}")
    
    file_wanted.close()

if __name__ == '__main__':
    main()

关键实现说明

  1. 文件指针保持:直接使用打开的文件对象进行连续读取,每次调用readline()后,文件指针会自动移动到下一行,保证后续批量处理从上次结束的位置开始
  2. 指定行数读取:通过循环batch_size次调用readline(),实现每次读取指定行数的内容,同时处理文件提前读完的情况
  3. 异常处理:跳过空行和非数字行,避免程序因无效内容崩溃,同时给出明确提示
  4. 简洁遍历:使用zip()同时遍历月份和天数列表,避免冗余的索引变量操作

内容的提问来源于stack exchange,提问作者Learning_How_To_Code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:51:12