如何在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
相关产品推荐
相关产品推荐

