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

如何将多文件中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']

解决方法

你的代码存在几个关键问题,修正后就能得到预期结果:

  1. for f in *.txt: 是Shell语法,Python中无法直接使用,需用glob.glob()获取所有txt文件
  2. 变量match未定义,实际匹配结果存在m中,判断条件应改为len(m) > 0
  3. 每次循环都重新初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:54:33