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

如何依据指定空格数Schema将特殊分隔TXT转为Pandas DataFrame?

解决方案

要将这种特殊格式的文本文件转换为保留空格的Pandas DataFrame,可根据已知的空格数Schema,采用以下两种方法实现:

方法一:正则表达式分割

核心思路是根据Schema构建正则模式,精准匹配每个列的内容(含需保留的空格)与分隔用的最后一个空格,提取后构建DataFrame。

步骤:

  1. 读取文件第一行,用分号分割得到列名。
  2. 根据空格数Schema构建正则匹配模式:
    • 对前N-1列,匹配「列内容 + 指定数量的保留空格」,再匹配作为分隔的单个空格。
    • 最后一列匹配剩余所有内容(含其前的空格)。
  3. 遍历所有数据行,用正则提取各列内容,最终转为DataFrame。

代码示例:

假设已知空格数Schema为:columnA后保留3个空格、columnB后保留3个、columnC后保留2个、columnD前的空格需保留:

import pandas as pd
import re

# 读取文件内容
with open('your_file.txt', 'r') as f:
    lines = f.readlines()

# 处理列名
columns = [col.strip() for col in lines[0].strip().split(';')]

# 构建正则模式(对应Schema)
# (.*?\s{3}) 匹配columnA内容+3个保留空格,\s匹配分隔空格;以此类推
pattern = r'(.*?\s{3})\s(.*?\s{3})\s(.*?\s{2})\s(.*)'

# 提取数据行内容
data = []
for line in lines[1:]:
    line = line.strip('\n')  # 仅去掉换行符,保留空格
    match = re.findall(pattern, line)
    if match:
        data.append(match[0])

# 构建DataFrame
df = pd.DataFrame(data, columns=columns)

方法二:固定宽度读取(pd.read_fwf)

如果已知每个列的总宽度(列值长度+需保留的空格数),可直接用Pandas的read_fwf按固定宽度读取,更高效。

步骤:

  1. 确定每个列的起始和结束位置(colspecs):
    • 列A:从0开始,到「列A值长度+保留空格数」的位置。
    • 列B:从「列A结束位置+1(分隔空格)」开始,到「该位置+列B值长度+保留空格数」。
    • 以此类推,最后一列从对应起始位置到行尾。
  2. 用read_fwf读取文件,指定列名和colspecs。

代码示例:

针对你的示例数据:

  • columnA值长度29,保留3个空格 → 宽度32,范围(0,32)
  • columnB值长度7,保留3个空格 → 宽度10,范围(33, 43)
  • columnC值长度8,保留2个空格 → 宽度10,范围(44, 54)
  • columnD从55到行尾
import pandas as pd

# 列名
columns = ['columnA', 'columnB', 'columnC', 'columnD']

# 指定各列的起始、结束位置(colspecs)
colspecs = [(0, 32), (33, 43), (44, 54), (55, None)]

# 读取文件
df = pd.read_fwf('your_file.txt', colspecs=colspecs, names=columns, skiprows=[0])

注:skiprows=[0]是跳过原文件的列名行,因为我们已经手动指定了names;如果原文件列名行的格式和数据行一致,也可以调整colspecs适配列名行,去掉skiprows参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:50:36