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

如何将文本文件中的两类表格转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:36:58