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

如何正确读取固定行宽文件并分配内容到列表/数组/DataFrame?

如何正确读取带方括号分组数据的文件并分配到指定列表?

问题场景

我有一个每行长度相同的文件,前三行内容如下:

0 MSG_201901010100.nc   [98.22227, 0.00014308207]  [3948.8948, 0.0057524233]
1 MSG_201901010200.nc  [197.27554, 0.00028737469]     [9986.71, 0.014547813]
2 MSG_201901010300.nc  [218.46107, 0.00031823604]   [12044.043, 0.017544765]

希望读取后分配为以下格式的列表:

a = [0,1,2]
b = ["R10CH20P_MSG_201901010100.nc", "R10CH20P_MSG_201901010200.nc", "R10CH20P_MSG_201901010300.nc"]
c1 = [98.22227, 197.27554, 218.46107]
c2 = [0.00014308207, 0.00028737469,0.00031823604]
d1 = [3948.8948, 9986.71, 12044.043]
d2 = [0.0057524233, 0.014547813, 0.017544765]

尝试用Pandas读取:

import pandas as pd
df = pd.read_table(filename, sep='\s+', names=['a', 'b', 'c1', 'c2', 'd1', 'd2' ])

但出现分配错误,输出的DataFrame中,方括号内的数值被拆分到了不同列,比如df['c1']的结果是:

0     [98.22227,
1    [197.27554,
2    [218.46107,
Name: c1, dtype: object

解决方案

方法1:Pandas预处理修正数据

问题核心是sep='\s+'会把方括号内的空格当作分隔符,破坏分组结构。可以先保留原始字段组,再单独解析方括号内的数值:

import pandas as pd

# 读取所有行,按空格拆分但保留方括号内的整体
with open(filename, 'r') as f:
    lines = [line.strip().split(None, 3) for line in f]

# 转换为DataFrame,拆分出大字段组
df = pd.DataFrame(lines, columns=['a', 'b', 'c_group', 'd_group'])

# 定义解析方括号分组的函数
def parse_group(s):
    nums = s.strip('[]').split(',')
    return [float(num.strip()) for num in nums]

# 解析c、d组的数值,拆分为单独列
df[['c1', 'c2']] = pd.DataFrame(df['c_group'].apply(parse_group).tolist())
df[['d1', 'd2']] = pd.DataFrame(df['d_group'].apply(parse_group).tolist())

# 转换数据类型并处理b列前缀
df['a'] = df['a'].astype(int)
df['b'] = 'R10CH20P_' + df['b']

# 提取为目标列表
a = df['a'].tolist()
b = df['b'].tolist()
c1 = df['c1'].tolist()
c2 = df['c2'].tolist()
d1 = df['d1'].tolist()
d2 = df['d2'].tolist()

方法2:纯Python原生处理

如果不需要Pandas,用原生方法更轻量:

a = []
b = []
c1 = []
c2 = []
d1 = []
d2 = []

with open(filename, 'r') as f:
    for line in f:
        # 拆分出4个大字段,避免破坏方括号内的内容
        parts = line.strip().split(None, 3)
        # 处理各列数据
        a.append(int(parts[0]))
        b.append(f'R10CH20P_{parts[1]}')
        
        # 解析c组数值
        c_vals = parts[2].strip('[]').split(',')
        c1.append(float(c_vals[0].strip()))
        c2.append(float(c_vals[1].strip()))
        
        # 解析d组数值
        d_vals = parts[3].strip('[]').split(',')
        d1.append(float(d_vals[0].strip()))
        d2.append(float(d_vals[1].strip()))

说明

两种方法的关键都是先拆分出大的字段组(用split(None, 3)限制拆分次数,保留方括号内的整体),再单独解析每个分组内的数值,避免空格分隔符破坏数据结构,最后按需求转换类型、添加前缀并提取为目标列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:25:18