如何从文件统计男女人数?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
相关产品推荐
相关产品推荐

