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

如何从文件统计男女人数?Python正则作业代码问题咨询

作业要求

本次任务为作业
使用提供的卫生部(MOH)接触追踪数据存档网页,通过正则表达式收集数据集。
需要提取以下信息:

  • 病例编号(Case No)
  • 年龄(Age)
  • 国籍(Nationality)
  • 性别(Sex)
  • 旅行史(Travel History)
  • 接触追踪情况(Contact Tracing)

任务1:将上述信息读取到Python合适的数据结构中,存储为开放格式文件(文本、JSON等),文件名标注网页最后更新日期。
任务2:统计病例中的男女人数、平均年龄,并在屏幕打印结果。

现有代码
import re

# open and read the file after the appending:
userinfo = open("usersinfo.txt", "r")

# Creating userinfo
# userinfo.write("1.	18 	Bahraini	F	US,AL		Parent\n")
# userinfo.write("2.	29 	Japanese	M	BH,CH		Wife\n")
# userinfo.write("3.	55 	Japanese	M	BH		Son\n")
# userinfo.write("4.	21 	Bahraini	F	KW,CH		Parent\n")
# userinfo.write("5.	24 	Bahraini	F	DK		Husband\n")
# userinfo.write("6.	30 	Egyptian	M	DK		Parent\n")
# userinfo.write("7.	23 	Egyptian	M	DK		Parent\n")
# userinfo.write("8.	32 	Egyptian	M	FR		Wife\n")
# userinfo.write("9.	29 	Indian	F	KW,RO		Brother\n")
# userinfo.write("10.	21 	Indian	M	RS		Parent\n")

countMale = 0
countFemale = 0
# Q1
for x in userinfo:
    re_gender = re.findall("[M|F]\b", userinfo.read())
    if re_gender == 'M':
        countMale += 1
    else:
        countFemale += 1
    print("The number of males: ", countMale, ", females: ", countFemale)

# Q2
for x in userinfo:
    ages = re.findall("\d{2}\s", userinfo.read())
    avg_age = sum(int(age) for age in ages) / len(ages)
    print("The average age: ", avg_age)

print(userinfo.read())
userinfo.close()
咨询问题

请问如何正确从文件中统计男女人数,同时完成平均年龄计算?

解决方案

现有代码存在几个关键问题:

  • 文件读取时,userinfo.read()会一次性读完整个文件,导致后续循环无法获取内容;
  • 正则表达式使用有误,[M|F]\b中的|是多余的,且findall返回列表,不能直接与字符串'M'比较;
  • 两次循环复用同一个文件对象,第一次读完后指针已到文件末尾,第二次循环无法读取数据。

修正后的代码可一次性读取所有行,逐行处理提取性别和年龄,同步完成统计:

import re

# 使用with语句自动管理文件资源
with open("usersinfo.txt", "r") as userinfo:
    lines = userinfo.readlines()

count_male = 0
count_female = 0
total_age = 0
case_count = 0

for line in lines:
    # 提取性别:匹配独立的M/F字符
    gender_match = re.search(r'\b[MF]\b', line)
    if gender_match:
        gender = gender_match.group()
        count_male += 1 if gender == 'M' else 0
        count_female += 1 if gender == 'F' else 0
    
    # 提取年龄:匹配两位数的年龄数值
    age_match = re.search(r'\b\d{2}\b', line)
    if age_match:
        total_age += int(age_match.group())
        case_count += 1

# 计算平均年龄,避免空文件时除以0的错误
average_age = total_age / case_count if case_count > 0 else 0

# 打印统计结果
print(f"男性人数:{count_male},女性人数:{count_female}")
print(f"平均年龄:{average_age:.2f}")

代码说明

  • 用with语句打开文件,自动处理文件关闭,避免资源泄漏;
  • 逐行读取数据,通过re.search精准提取目标字段,规避findall返回列表的问题;
  • 单次循环完成性别统计与年龄累加,提升效率;
  • 加入case_count判断,处理空文件或无有效年龄数据的边界情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:45:31