Python读取CSV匹配症状异常:无法正确识别疾病问题排查
问题诊断与修复方案
核心错误点
- CSV读取参数错误:
csv.reader('dataset.csv')传入的是字符串而非打开的文件对象,导致CSV读取器将字符串的每个字符当作单独行处理,这就是输出"d."的直接原因(字符串第一个字符是'd')。正确写法应为csv.reader(csv_file)。 - 代码缩进错误:
for row in csv_reader:及后续逻辑缩进脱离了with open(...)代码块,文件在with结束后已自动关闭,此时迭代csv_reader会读取无效内容。 - 症状匹配精度问题:数据集里部分症状前缀带有
and(比如and shortness of breath),且存在大小写不一致(比如Fever和fever),直接全等匹配会导致大量漏判。
修正后的代码
#!/usr/bin/env python3 import argparse import csv # 解析命令行参数 parser = argparse.ArgumentParser() parser.add_argument('-t', '--task', help='输入需要匹配的症状,用逗号分隔') parser.add_argument('-d', '--dataset', help='指定数据集文件路径') args = parser.parse_args() # 处理输入症状:去空格、统一转为小写 task_symptoms = [sym.strip().lower() for sym in args.task.split(', ')] # 存储疾病与匹配次数的字典 disease_counts = {} try: # 打开数据集文件 with open(args.dataset, 'r') as csv_file: csv_reader = csv.reader(csv_file) # 遍历每一行数据 for row in csv_reader: if not row: continue disease = row[0].strip() # 处理数据集症状:去除and前缀、去空格、统一小写 cleaned_symptoms = [] for sym in row[1:]: sym_clean = sym.strip().lower() if sym_clean.startswith('and '): sym_clean = sym_clean[4:] cleaned_symptoms.append(sym_clean) # 统计匹配的症状数量 match_count = 0 for task_sym in task_symptoms: if task_sym in cleaned_symptoms: match_count += 1 disease_counts[disease] = match_count if not disease_counts: print("数据集内无有效数据。") exit() # 获取最高匹配次数 max_match = max(disease_counts.values()) # 筛选出所有最高匹配的疾病 probable_diseases = [k for k, v in disease_counts.items() if v == max_match] # 输出结果 if len(probable_diseases) == 1: print(f'The patient is likely suffering from {probable_diseases[0]}.') else: print(f'The patient is likely suffering from one of these: {", ".join(probable_diseases)}.') except FileNotFoundError: print("错误:无法找到指定的数据集文件。") except AttributeError: print("错误:请使用-t和-d参数分别传入症状和数据集路径。")
测试示例
执行命令:
python3 your_script.py -t "Wheezing, coughing" -d dataset.csv
输出结果:
The patient is likely suffering from Asthma.
内容的提问来源于stack exchange,提问作者Sophia Hamdani
相关产品推荐
相关产品推荐

