如何实现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()
关键实现说明
- 文件指针保持:直接使用打开的文件对象进行连续读取,每次调用
readline()后,文件指针会自动移动到下一行,保证后续批量处理从上次结束的位置开始 - 指定行数读取:通过循环
batch_size次调用readline(),实现每次读取指定行数的内容,同时处理文件提前读完的情况 - 异常处理:跳过空行和非数字行,避免程序因无效内容崩溃,同时给出明确提示
- 简洁遍历:使用
zip()同时遍历月份和天数列表,避免冗余的索引变量操作
内容的提问来源于stack exchange,提问作者Learning_How_To_Code
相关产品推荐
相关产品推荐

