Python如何合并文本文件指定行并转换为pandas dataframe
问题解答
首先明确:不建议先转DataFrame再做行合并,直接在文本层完成记录合并再转为DataFrame,逻辑更简单、执行效率更高。
核心原因
原始文本的记录是跨行拆分的,转入DataFrame后你仍需要处理跨行关联逻辑,反而增加了复杂度,不如先在字符串层面完成整记录拼接,再做结构化转换。
完整实现方案
步骤1:文本预处理,合并跨行记录
思路是用缓存变量拼接当前未结束的记录,遇到Done.就把完整记录存入结果列表:
# 读取原始文件 with open("你的文件路径.txt", "r", encoding="utf-8") as f: raw_lines = f.readlines() full_records = [] current_record = "" for line in raw_lines: stripped_line = line.strip() if not stripped_line: continue # 拼接当前行到缓存 current_record += f" {stripped_line}" # 检测是否到记录末尾 if current_record.strip().endswith("Done."): full_records.append(current_record.strip()) current_record = ""
执行完成后full_records里每个元素就是一条完整的video开头、Done.结尾的记录。
步骤2:转换为Pandas DataFrame
你可以根据自己需要拆分字段,以下是拆分基础信息+坐标框的示例:
import pandas as pd import re df_rows = [] for record in full_records: # 匹配基础字段 match_res = re.match(r"video (\d+/\d+) \((\d+)/(\d+)\) (.*) Done\.", record) if not match_res: continue # 提取通用字段 video_batch = match_res.group(1) frame_index = int(match_res.group(2)) total_frame = int(match_res.group(3)) # 提取所有坐标框 bbox_list = re.findall(r"\(\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*\)", match_res.group(4)) # 坐标转整数格式 bbox_list = [tuple(map(int, bbox)) for bbox in bbox_list] df_rows.append({ "视频批次": video_batch, "帧序号": frame_index, "总帧数": total_frame, "检测框坐标": bbox_list }) # 生成DataFrame df = pd.DataFrame(df_rows)
如果不需要保留坐标结构,想把每个坐标拆成单独列,只要调整字段拼接逻辑即可。
内容的提问来源于stack exchange,提问作者nbafanatic
相关产品推荐
相关产品推荐

