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

如何用Pandas读取分行节式格式化的文本文件?

用Pandas读取含分段数据的文本文件并整理为多列结构

需求说明

习惯使用pandas.read_csv处理文本文件,但遇到包含大量元数据的文本文件,无需预处理直接用Python常用库读取,要求:

  • 将每个数据段转为Pandas的一列,数据段内跨行的空格分隔数值需完整收集
  • 保留数据段末尾的Total、Average等元信息
  • 最终形成等长多列的DataFrame结构

解决方案

可以通过逐行解析文件内容,识别数据段的标题、数值和元数据,再组合成DataFrame,具体实现如下:

代码实现

import pandas as pd
import re

# 读取目标文件(替换为你的文件路径)
with open('neutron_data.txt', 'r') as f:
    # 过滤空行并去除每行首尾空格
    lines = [line.strip() for line in f if line.strip()]

segments = []
current_segment = None

for line in lines:
    # 识别数据段标题:非数值开头,且不是Total/Average行
    if not re.match(r'^[\d.E+-]+', line) and not line.startswith(('Total', 'Average')):
        # 保存上一个数据段
        if current_segment is not None:
            segments.append(current_segment)
        # 初始化新数据段,可在此简化列名
        title = line
        if 'Neutron Multigroup Structure' in title:
            title = 'Neut. Mult. Energy.'
        elif '(a,n)' in title:
            title = '(a,n) from..'
        elif 'Total Neutron Spectrum' in title:
            title = 'Total Neutron Spectrum'
        
        current_segment = {
            'title': title,
            'values': [],
            'meta': {}
        }
    # 提取Total元数据
    elif line.startswith('Total'):
        num_match = re.search(r'([\d.E+-]+)', line)
        if num_match:
            current_segment['meta']['total'] = float(num_match.group(1))
    # 提取Average元数据
    elif line.startswith('Average'):
        num_match = re.search(r'([\d.E+-]+)', line)
        if num_match:
            current_segment['meta']['average_energy'] = float(num_match.group(1))
    # 收集数值行数据
    else:
        values = [float(val) for val in line.split()]
        current_segment['values'].extend(values)

# 加入最后一个数据段
if current_segment is not None:
    segments.append(current_segment)

# 组合为DataFrame
df = pd.DataFrame({seg['title']: seg['values'] for seg in segments})

# 将元信息存储到DataFrame的attrs中(Pandas 1.3.0及以上版本支持)
df.attrs['segment_metadata'] = {seg['title']: seg['meta'] for seg in segments}

# 查看结果
print("整理后的DataFrame前5行:")
print(df.head())
print("\n各数据段元信息:")
print(df.attrs['segment_metadata'])

代码说明

  1. 文件读取与预处理:过滤空行并去除每行首尾空格,减少无效处理
  2. 数据段识别:通过正则和关键词判断行类型,区分标题、数值、元数据行
  3. 数据收集:将每个数据段的数值跨行收集为完整列表,同时提取Total和Average数值
  4. DataFrame构建:用字典推导式将各数据段转为列,确保列长度一致
  5. 元信息存储:将元数据存在DataFrame的attrs属性中,不影响主数据结构,方便后续调用

效果验证

运行代码后会输出符合需求的多列DataFrame,列名可根据需求自定义简化,元信息也会完整保留。

内容的提问来源于stack exchange,提问作者villaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:34:56