如何修复Python代码:提取cap编号并统计File2对应数据量
修正文本匹配与统计代码的方案
需求回顾
从file1.txt中提取以cap开头的编号(如将cap00001转换为整数1),然后在file2.txt中匹配这些编号对应的capNo列,统计每个有效capNo的出现次数,输出指定格式的结果。
原代码的问题
- 语法错误:Python关键字
with被写成大写With,直接导致代码无法运行 - 编号转换逻辑错误:
match.remove(cap0000)完全不符合语法——cap0000是字符串需加引号,且remove方法会修改原列表并返回None,不能直接赋值;更合理的方式是用正则捕获数字部分,而非手动移除前缀 - 数据处理错误:直接读取
file2.txt为字符串后调用groupby,但字符串没有这个方法,必须用pandas将文件解析为DataFrame才能进行分组统计 - 逻辑效率低下:循环中每匹配到一个
cap就重复打开file2.txt,既浪费资源又导致统计逻辑混乱
修正后的代码
import re import pandas as pd # 从file1.txt提取所有有效capNo并转成整数 cap_numbers = [] with open("file1.txt", "r") as infile1: for line in infile1: # 正则捕获cap后面的数字部分,自动忽略前缀 matches = re.findall(r'cap(\d+)', line) if matches: # 把捕获的数字字符串转成整数,自动去除前导零 cap_num = int(matches[0]) cap_numbers.append(cap_num) # 去重,避免重复统计同一个capNo cap_numbers = list(set(cap_numbers)) # 读取file2.txt为DataFrame,处理空格分隔的格式 df = pd.read_csv("file2.txt", sep=r'\s+') # 筛选出capNo在提取列表中的行,然后分组统计数量 filtered_df = df[df['capNo'].isin(cap_numbers)] result = filtered_df.groupby('capNo').size().reset_index(name='counts') # 按期望格式输出结果 print("capNo counts") for _, row in result.iterrows(): print(f"{row['capNo']} {row['counts']}")
代码说明
- 正则表达式
r'cap(\d+)'直接捕获cap后面的数字部分,无需手动处理前缀,简洁高效 - 用
pd.read_csv配合sep=r'\s+'处理file2.txt的空格分隔格式,自动识别列名 - 用
isin方法筛选出与file1匹配的capNo行,再通过groupby.size()统计每个编号的出现次数 - 最后按指定格式打印结果,与期望输出一致
内容的提问来源于stack exchange,提问作者Rob John
相关产品推荐
相关产品推荐

