如何依据指定空格数Schema将特殊分隔TXT转为Pandas DataFrame?
解决方案
要将这种特殊格式的文本文件转换为保留空格的Pandas DataFrame,可根据已知的空格数Schema,采用以下两种方法实现:
方法一:正则表达式分割
核心思路是根据Schema构建正则模式,精准匹配每个列的内容(含需保留的空格)与分隔用的最后一个空格,提取后构建DataFrame。
步骤:
- 读取文件第一行,用分号分割得到列名。
- 根据空格数Schema构建正则匹配模式:
- 对前N-1列,匹配「列内容 + 指定数量的保留空格」,再匹配作为分隔的单个空格。
- 最后一列匹配剩余所有内容(含其前的空格)。
- 遍历所有数据行,用正则提取各列内容,最终转为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按固定宽度读取,更高效。
步骤:
- 确定每个列的起始和结束位置(colspecs):
- 列A:从0开始,到「列A值长度+保留空格数」的位置。
- 列B:从「列A结束位置+1(分隔空格)」开始,到「该位置+列B值长度+保留空格数」。
- 以此类推,最后一列从对应起始位置到行尾。
- 用
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
相关产品推荐
相关产品推荐

