如何将文本文件中的两类表格转换为Python字典?
文本表格转Python字典的实现方案
我有多个包含表格的文本文件,主要分为两种类型,需要将它们转换为Python字典,期望输出格式如下:
{ "BASE_RENT_ANNUAL": {"precision": 0.53, "recall": 0.57, "f1-score": 0.55, "support": 1408}, "BASE_RENT_MONTHLY": {...}, ... }
类型1:分类指标表格处理
表格示例
precision recall f1-score support BASE_RENT_ANNUAL 0.53 0.57 0.55 1408 BASE_RENT_MONTHLY 0.65 0.54 0.59 3904 BASE_RENT_PSF 0.68 0.59 0.63 1248 RENT_INCREMENT_MONTHLY 0.63 0.44 0.52 7530 SECURITY_DEPOSIT_AMOUNT 0.88 0.89 0.88 3557 micro avg 0.69 0.58 0.63 17647 macro avg 0.67 0.61 0.63 17647 weighted avg 0.68 0.58 0.62 17647
转换代码
def parse_type1_table(file_path): result = {} with open(file_path, 'r') as f: # 过滤空行并去除首尾空格 lines = [line.strip() for line in f if line.strip()] # 提取表头行的指标名称 headers = lines[0].split() # 遍历数据行(默认跳过最后3个avg行,如需保留可取消注释) for line in lines[1:-3]: parts = line.split() # 类别名可能包含空格,取前n-4个部分拼接 category = ' '.join(parts[:-4]) # 构建指标字典,转换数据类型 metrics = { headers[0]: float(parts[-4]), headers[1]: float(parts[-3]), headers[2]: float(parts[-2]), headers[3]: int(parts[-1]) } result[category] = metrics # 如需保留micro/macro/weighted avg行,取消以下注释 # for line in lines[-3:]: # parts = line.split() # category = ' '.join(parts[:-4]) # metrics = { # headers[0]: float(parts[-4]), # headers[1]: float(parts[-3]), # headers[2]: float(parts[-2]), # headers[3]: int(parts[-1]) # } # result[category] = metrics return result # 使用示例 type1_result = parse_type1_table("type1.txt") print(type1_result)
类型2:多段评估指标表格处理
表格示例
Hard Evaluation Metrics -------------------------------------------------- Reading predictions from /mnt/c/Users/Aleksandra/mlbuddy/python/bilstm/training/test_predictions.txt... Nb tokens in test set: 957800 Reading training data from /mnt/c/Users/Aleksandra/mlbuddy/python/bilstm/corpus/train.txt... Nb tokens in training set: 211153 Strict mode: OFF --------------------------------------------------------------------- Test tokens Nb tokens Nb words Nb errors Token error rate --------------------------------------------------------------------- all 957800 5408 39333 0.0411 --------------------------------------------------------------------- unseen-I 704 19 704 1.0000 unseen-O 59870 1724 10208 0.1705 unseen-all 60574 1743 10912 0.1801 --------------------------------------------------------------------- diff-I 13952 70 13952 1.0000 diff-O 5285 121 4645 0.8789 diff-etype 0 0 0 0.0000 diff-all 19237 191 18597 0.9667 --------------------------------------------------------------------- all-unseen+diff 79811 1934 29509 0.3697 --------------------------------------------------------------------- Avg TER on unseen and diff: 0.5734
问题分析
你之前的代码仅处理了第一段表格数据,且文件指针操作混乱,导致无法完整提取所有分段的表格内容。
修正后的转换代码
def parse_type2_table(file_path): result = {} with open(file_path, 'r') as f: # 过滤空行并去除首尾空格 lines = [line.strip() for line in f if line.strip()] # 定位表头行位置 header_idx = None for i, line in enumerate(lines): if line.startswith('Test tokens'): header_idx = i break if not header_idx: return result # 提取表头名称 headers = lines[header_idx].split() current_data_lines = [] # 遍历表头后的所有行,按分割线分段处理 for line in lines[header_idx + 1:]: # 判断是否为分割线(全为'-'字符) if all(c == '-' for c in line): # 处理当前收集的数据行 if current_data_lines: for data_line in current_data_lines: parts = data_line.split() token_type = parts[0] # 构建指标字典,转换数据类型 metrics = { headers[1]: int(parts[1]), headers[2]: int(parts[2]), headers[3]: int(parts[3]), headers[4]: float(parts[4]) } result[token_type] = metrics current_data_lines = [] else: current_data_lines.append(line) # 处理最后一段未被分割线收尾的数据 if current_data_lines: for data_line in current_data_lines: parts = data_line.split() token_type = parts[0] metrics = { headers[1]: int(parts[1]), headers[2]: int(parts[2]), headers[3]: int(parts[3]), headers[4]: float(parts[4]) } result[token_type] = metrics return result # 使用示例 type2_result = parse_type2_table("type2.txt") print(type2_result)
内容的提问来源于stack exchange,提问作者glitch_123
相关产品推荐
相关产品推荐

