如何用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'])
代码说明
- 文件读取与预处理:过滤空行并去除每行首尾空格,减少无效处理
- 数据段识别:通过正则和关键词判断行类型,区分标题、数值、元数据行
- 数据收集:将每个数据段的数值跨行收集为完整列表,同时提取Total和Average数值
- DataFrame构建:用字典推导式将各数据段转为列,确保列长度一致
- 元信息存储:将元数据存在DataFrame的
attrs属性中,不影响主数据结构,方便后续调用
效果验证
运行代码后会输出符合需求的多列DataFrame,列名可根据需求自定义简化,元信息也会完整保留。
内容的提问来源于stack exchange,提问作者villaa
相关产品推荐
相关产品推荐

