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

如何将空格分隔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会把连续空格当成单个分隔符,导致列对齐完全错误。以下是修正方案:

解决步骤

  1. 用固定宽度读取方法解析文件
    使用pd.read_fwf自动识别固定宽度列,完美匹配原文件格式:

    import pandas as pd
    
    df = pd.read_fwf("_teste", header=None, dtype=object)
    
  2. 统一列数为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)
    
  3. 追加最后一行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:01:14