Python读取同目录TXT文件报错求助:数组计算最值功能正常
解决Python读取TXT文件计算统计值的报错问题
嘿,我太懂这种手动测试一切正常,一碰文件读取就掉坑的郁闷了!咱们来一步步揪出问题根源,把它解决掉。
首先,先复盘下你遇到的核心矛盾:手动定义数组values = [1,5,77]时统计功能正常,说明你的统计逻辑没问题,问题肯定出在TXT文件读取/内容转换这一步。下面是最常见的几个坑和对应的解决方案:
一、先确认你的TXT文件格式
这是最容易踩的坑!假设你的TXT文件内容是下面两种常见格式之一:
格式1:每行一个数值
10 0 50 99 -200
格式2:一行内用逗号/空格分隔数值
10, 0, 50, 99, -200
如果你的文件里有非数值内容(比如空格、注释、特殊符号),或者格式混乱,转换数值时就会直接报错。
二、针对不同格式的修正代码
我给你写了带异常处理的完整代码,能帮你避开大部分坑:
针对格式1(每行一个数值)的代码
from statistics import median import os max_value = None min_value = None avg_value = None med_value = None try: # 获取脚本所在目录,拼接文件路径(避免工作目录不一致的问题) script_dir = os.path.dirname(__file__) file_path = os.path.join(script_dir, "your_file.txt") # 替换成你的TXT文件名 with open(file_path, 'r', encoding='utf-8') as file: values = [] for line_num, line in enumerate(file, 1): stripped_line = line.strip() # 跳过空行 if not stripped_line: continue # 尝试转换为数值(如果是小数就把int改成float) try: num = int(stripped_line) values.append(num) except ValueError: print(f"⚠️ 第{line_num}行跳过非数值内容:'{stripped_line}'") # 确保有有效数值再计算统计量 if values: max_value = max(values) min_value = min(values) avg_value = sum(values) / len(values) med_value = median(values) print(f"最大值: {max_value}") print(f"最小值: {min_value}") print(f"平均值: {avg_value:.2f}") print(f"中位数: {med_value}") else: print("❌ 文件中没有读取到有效数值,请检查文件内容") except FileNotFoundError: print(f"❌ 未找到文件:{file_path},请确认文件名和路径是否正确") except Exception as e: print(f"❌ 发生未知错误:{str(e)}")
针对格式2(一行内分隔数值)的代码
只需要把读取部分替换成下面这段:
# 替换原代码中的with open部分 with open(file_path, 'r', encoding='utf-8') as file: content = file.read().strip() # 按逗号分割(如果是空格分隔就改成split()) num_strings = [s.strip() for s in content.split(',')] values = [] for idx, s in enumerate(num_strings, 1): if s: try: num = int(s) values.append(num) except ValueError: print(f"⚠️ 第{idx}个元素跳过非数值内容:'{s}'")
三、常见报错的排查方向
- 文件路径问题:有时候你以为脚本和TXT同目录,但运行脚本的工作目录其实不是脚本所在文件夹(比如用IDE运行时的工作目录设置不对)。上面的代码用
os.path.dirname(__file__)获取脚本目录,能彻底解决这个问题。 - 非数值内容:文件里的空格、换行、注释或特殊字符都会导致
int()/float()转换失败,代码里的try-except会帮你跳过这些内容并给出提示。 - 编码问题:如果你的TXT文件是GBK等非UTF-8编码,读取时会乱码,把
encoding='utf-8'改成encoding='gbk'试试。 - 空文件/全空行:这种情况
values会是空数组,代码里的判断会提前提示你,避免计算时报错。
内容的提问来源于stack exchange,提问作者Ossian Lundberg
相关产品推荐
相关产品推荐

