如何将多文件中re.findall的匹配结果合并到Pandas DataFrame?
问题
我编写的代码想要读取多个txt文件(以下是2个示例),匹配每个文件每行中的数字,然后把所有匹配结果和对应的文件名合并成一个DataFrame。但现在遇到问题:re.findall的输出是多行结果,不知道怎么正确追加。
文件示例
F1.txt:
trust 65 musca linca 75 trig torst 50
F2.txt:
munk 65 liki 34 grub
期望的DataFrame格式
Filename score F1 65 F1 75 F1 50 F2 65 F2 34
我的尝试代码
import os import re import pandas as pd final={} for f in *.txt: with open(f,"r") as In1: (filename,ext)=os.path.splitext(f) for line in In1: m=re.findall(r'\d+',line) if len(match) > 0: all=[] all.append(m) final[filename]=all df=pd.DataFrame(final.items(),columns=['Filename','Score']
解决方法
你的代码存在几个关键问题,修正后就能得到预期结果:
for f in *.txt:是Shell语法,Python中无法直接使用,需用glob.glob()获取所有txt文件- 变量
match未定义,实际匹配结果存在m中,判断条件应改为len(m) > 0 - 每次循环都重新初始化
all=[]会覆盖之前的结果,且用字典存储会导致每个文件名对应一个分数列表,无法生成每行一条记录的DataFrame
修正后的代码如下:
import re import pandas as pd from glob import glob # 存储所有(文件名, 分数)的元组 data = [] # 获取当前目录下所有txt文件 for file_path in glob("*.txt"): # 提取不带后缀的文件名 filename = file_path.split('.')[0] with open(file_path, "r") as f: for line in f: # 匹配该行所有数字 scores = re.findall(r'\d+', line) # 每个分数单独生成一条记录 for score in scores: data.append((filename, int(score))) # 转换为目标格式的DataFrame df = pd.DataFrame(data, columns=['Filename', 'score']) print(df)
代码说明
glob("*.txt")可以便捷获取当前目录下所有txt文件路径,比os.listdir()更贴合需求- 用列表存储单个(文件名, 分数)元组,确保转换DataFrame时每行对应一条记录
- 遍历
re.findall返回的分数列表,避免一行多个分数的情况,完全匹配你的预期格式 - 将分数转为整数类型,方便后续数值操作,若需字符串类型可去掉
int()
运行后输出的DataFrame将完全符合你期望的格式。
内容的提问来源于stack exchange,提问作者Rob John
相关产品推荐
相关产品推荐

