基于列表元素匹配文件名并将内容追加至DataFrame的实现方案
嘿,我来帮你搞定这个问题!你的思路方向是对的,但现有代码里有几个小坑(比如每次循环都重置DataFrame、文件名匹配没用到item变量、逐行读取效率低),我来一步步帮你修正并优化:
首先,用glob快速匹配目标文件
处理文件名匹配的话,glob模块比手写正则更简洁高效,它专门用来匹配文件路径。比如要找所有以a_开头的.bed文件,直接用glob.glob("a_*.bed")就行。
完整优化代码
import pandas as pd import glob # 你的初始列表 myList = ['a', 'b', 'c'] # 初始化一个列表来存储每个文件的DataFrame(比反复append高效) dfs = [] for item in myList: # 匹配当前item对应的所有.bed文件,比如item='a'时找a_*.bed matching_files = glob.glob(f"{item}_*.bed") for file_path in matching_files: # 读取bed文件:bed通常是制表符分隔,若文件有表头可去掉header=None df_temp = pd.read_table(file_path, sep='\t', header=None) # 可选:添加一列记录数据来源的文件名,方便后续溯源 df_temp['source_file'] = file_path # 将临时DataFrame加入列表 dfs.append(df_temp) # 合并所有临时DataFrame成一个大表 final_df = pd.concat(dfs, ignore_index=True)
代码说明
- 文件匹配:
glob.glob(f"{item}_*.bed")会自动找出当前目录下所有以{item}_开头、.bed结尾的文件,完全符合你的需求。 - 高效读取:用
pd.read_table()直接读取整个文件,比逐行读取+手动append高效太多,还能自动处理bed文件的制表符分隔格式。 - 合并方式:先把每个文件的DataFrame存入列表,最后用
pd.concat()合并——这是Pandas官方推荐的方式,因为旧的df.append()已经被弃用了。 - 溯源列:添加
source_file列是个小技巧,能帮你后续快速知道每条数据来自哪个文件,排查问题很方便。
如果你确实需要用正则的情况
如果你的文件名规则更复杂(比如需要匹配特定格式的数字后缀),可以用re模块配合os来过滤文件:
import pandas as pd import os import re myList = ['a', 'b', 'c'] dfs = [] folder_path = "./your_folder" # 替换成你的文件夹路径 # 获取文件夹里所有.bed文件 all_bed_files = [f for f in os.listdir(folder_path) if f.endswith('.bed')] for item in myList: # 正则规则:以item开头,下划线,然后任意数字,最后.bed pattern = re.compile(f"^{item}_[0-9]+\.bed$") # 筛选符合规则的文件,拼接完整路径 matching_files = [os.path.join(folder_path, f) for f in all_bed_files if pattern.match(f)] for file_path in matching_files: df_temp = pd.read_table(file_path, sep='\t', header=None) df_temp['source_file'] = file_path dfs.append(df_temp) final_df = pd.concat(dfs, ignore_index=True)
这个正则^${item}_[0-9]+\.bed$会严格匹配item+下划线+纯数字+.bed的文件,比如a_3432.bed会匹配,a_abc.bed就不会,适合更精准的场景。
内容的提问来源于stack exchange,提问作者Liquidity
相关产品推荐
相关产品推荐

