如何正确读取固定行宽文件并分配内容到列表/数组/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
相关产品推荐
相关产品推荐

