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

如何在Python中从列表元素生成指定结构的DataFrame表格

问题:拆分固定宽度文本生成指定结构DataFrame

将PDF转成TXT后,提取虚线行后的目标数据,但列表中的长字符串无法拆分为独立元素,尝试用replace()处理但仅适用于单个字符串,需要将这些多行字符串整理成指定结构的DataFrame。

TXT输入样本

Item      Material/Description  Contract Delivery Date              
Total Qty   UM                 Net Price       Extended Amount
------------------------------------------------------------------- 
------------------------------------------------------------------- 
---------------------------------
     1    1TD1131D17025-2035    09/16/2022      2     EA     353.60        707.20 
SHEAR PANEL

现有代码

import pandas as pd
import string

PO = open('5000298001-Original.txt','r',encoding = 'utf8')

line_text = enumerate(PO.readlines())

PO.seek(0)

count = PO.readlines()[2]

PO.seek(0)


line_nu = []
for i, line in line_text:
    if count == line:
        next_count = i +1
        next_line = PO.readlines()[next_count]
        line_nu.append(next_line)
        PO.seek(0)

当前输出

['    1        1TD1131D17025-2035              09/16/2022                              
2     EA                       353.60                         
707.20 \n', '    2        1TD1131D17025-2036              
09/16/2022                              2     EA                        
353.60                         707.20 \n', '    3        
1TD1131D17025-2037              09/16/2022                              
2     EA                       353.60                         
707.20 \n']

目标DataFrame

item   part               ship_date   qty   PP      EP
1     1TD1131D17025-2035  09/16/2022  2   353.60  707.20
2     1TD1131D17025-2036  09/16/2022  2   353.60  707.20   
3     1TD1131D17025-2037  09/16/2022  2   353.60  707.20

解决方案

这里的文本属于固定宽度格式,不能直接用普通空格拆分,推荐两种实用方法:

方法1:用pandas的read_fwf直接读取(最简便)

read_fwf是pandas专门处理固定宽度文本的工具,可直接指定列宽或自动识别,一步生成目标DataFrame:

import pandas as pd

# 定义列名和对应列宽(根据文本格式调整)
col_names = ['item', 'part', 'ship_date', 'qty', 'UM', 'PP', 'EP']
col_widths = [8, 22, 18, 6, 8, 18, 18]

# 读取文件:跳过前4行(表头+虚线),跳过最后一行的备注行
df = pd.read_fwf('5000298001-Original.txt', 
                 widths=col_widths, 
                 names=col_names,
                 skiprows=4,
                 skipfooter=1,
                 encoding='utf8')

# 移除不需要的UM列,清理多余空格
df = df.drop('UM', axis=1)
df = df.apply(lambda x: x.str.strip() if x.dtype == 'object' else x)
print(df)

方法2:手动处理字符串列表

如果需要更灵活的控制,可先合并多行条目,再按连续空白拆分:

import pandas as pd

# 读取所有行
with open('5000298001-Original.txt', 'r', encoding='utf8') as f:
    lines = f.readlines()

# 筛选虚线后的目标行
target_lines = []
start_processing = False
for line in lines:
    if '---' in line:
        start_processing = True
        continue
    if start_processing and line.strip() and 'SHEAR PANEL' not in line:
        target_lines.append(line.strip())

# 合并拆分到多行的条目
items = []
current_item = []
for line in target_lines:
    if line[0].isdigit():
        if current_item:
            items.append(' '.join(current_item))
            current_item = []
        current_item.append(line)
    else:
        current_item.append(line)
if current_item:
    items.append(' '.join(current_item))

# 拆分字段并生成DataFrame
data = []
for item_str in items:
    fields = [x for x in item_str.split() if x]
    data.append([fields[0], fields[1], fields[2], fields[3], fields[5], fields[6]])

df = pd.DataFrame(data, columns=['item', 'part', 'ship_date', 'qty', 'PP', 'EP'])
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:57:43