如何将空格分隔TXT文件转换为指定格式的Pandas DataFrame?
问题
我有如下格式的TXT文件:
DBSH (NFr) O (NTo) Nc C (Vmn (Vmx Bctrl (Qini) T A (Extr 121 D 0950 1050 121 -10. C (G O E (U) UOp (Sht ) M 1 2 2 -5. S 2 1 0 -10. S FBAN (NFr) O (NTo) Nc C (Vmn (Vmx Bctrl (Qini) T A (Extr 125 D 0950 1050 125 3.1 C (G O E (U) UOp (Sht ) M 1 3 1 3.1 S 2 1 0 -5. S FBAN
我希望得到如下格式的DataFrame:
DBSH NaN NaN NaN NaN Nan NaN NaN NaN NaN NaN NaN (NFr) O (NTo) Nc C (Vmn (Vmx Bctrl (Qini) T A (Extr 121 NaN NaN NaN D 0950 1050 121 -10. C NaN NaN (G O E (U) UOp (Sht ) M NaN NaN NaN NaN NaN 1 NaN NaN 2 2 -5. S NaN NaN NaN NaN NaN 2 NaN NaN 1 0 -10. S NaN NaN NaN NaN NaN FBAN NaN NaN NaN NaN Nan NaN NaN NaN NaN NaN NaN (NFr) O (NTo) Nc C (Vmn (Vmx Bctrl (Qini) T A (Extr 125 NaN NaN NaN D 0950 1050 125 3.1 C NaN NaN (G O E (U) UOp (Sht ) M NaN NaN NaN NaN NaN 1 NaN NaN 3 1 3.1 S NaN NaN NaN NaN NaN 2 NaN NaN 1 0 -5. S NaN NaN NaN NaN NaN FBAN NaN NaN NaN NaN Nan NaN NaN NaN NaN NaN NaN 99999 NaN NaN NaN NaN Nan NaN NaN NaN NaN NaN NaN
我已尝试以下代码:
data_file = _teste data_file_delimiter = " " largest_columns_count = 0 with open(data_file, 'r') as temp_f: lines = temp_f.readlines() for l in lines: column_count = len(l.split(data_file_delimiter))+1 largest_columns_count = column_count if largest_columns_count < column_count else largest_columns_count column_names = [i for i in range(0, largest_columns_count - 1)] df = pd.read_csv(data_file, header=None, delimiter=data_file_delimiter, names=column_names, dtype=object)
但输出结果不符合预期,请问该如何解决?
解决方案
你的问题核心是用普通空格分隔读取文件,但原文件是固定宽度格式(列与列用固定数量空格区分),pd.read_csv会把连续空格当成单个分隔符,导致列对齐完全错误。以下是修正方案:
解决步骤
用固定宽度读取方法解析文件
使用pd.read_fwf自动识别固定宽度列,完美匹配原文件格式:import pandas as pd df = pd.read_fwf("_teste", header=None, dtype=object)统一列数为12列
检查当前列数,不足的话补充NaN列:target_cols = 12 current_cols = df.shape[1] if current_cols < target_cols: # 添加缺失的列,填充NaN df = pd.concat([ df, pd.DataFrame(pd.NA, index=df.index, columns=range(current_cols, target_cols)) ], axis=1)追加最后一行
99999数据
构造目标行并添加到DataFrame末尾:last_row = pd.Series(["99999"] + [pd.NA]*(target_cols-1), index=df.columns) df = pd.concat([df, last_row.to_frame().T], ignore_index=True)
完整代码
import pandas as pd # 读取固定宽度文件 df = pd.read_fwf("_teste", header=None, dtype=object) # 统一列数为12列 target_cols = 12 current_cols = df.shape[1] if current_cols < target_cols: df = pd.concat([ df, pd.DataFrame(pd.NA, index=df.index, columns=range(current_cols, target_cols)) ], axis=1) # 添加最后一行99999数据 last_row = pd.Series(["99999"] + [pd.NA]*(target_cols-1), index=df.columns) df = pd.concat([df, last_row.to_frame().T], ignore_index=True) # 输出匹配预期格式的结果 print(df.to_string(index=False, na_rep='NaN'))
说明
pd.read_fwf会自动识别固定宽度列,无需手动指定分隔符,彻底解决连续空格导致的列错位问题。- 补全列数确保所有行都有12列,和你期望的格式完全对齐。
- 最后追加的行严格匹配要求的
99999开头格式。
内容的提问来源于stack exchange,提问作者Ruan Carlo Weiers Britzke
相关产品推荐
相关产品推荐

