如何提取.psa文件指定行的指定列并批量处理压缩包内文件?
解决方案:批量处理PSA文件并提取指定数据
核心问题分析
你的现有代码存在几个关键问题:
- 多余的TXT转换:PSA文件本身是逗号分隔格式,无需转成TXT再处理
- 未过滤目标行:没有筛选以
prod开头的行,导致结果包含无关数据 - 列提取报错:
usecols=[2]报错是因为错误地将第一行设为表头(header=0),若原文件无表头会导致列数不匹配 - 缺少门店号提取逻辑:未从文件名中解析出门店编号
单个PSA文件处理代码
import pandas as pd import re def process_single_psa(file_path): # 从文件名提取门店号(匹配"store 数字"格式) store_match = re.search(r'store (\d+)', file_path) store_number = store_match.group(1) if store_match else "未知门店" # 读取文件并筛选目标行 result_data = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() # 只处理以prod开头的行 if stripped_line.startswith('prod'): columns = stripped_line.split(',') # 确保行有至少3个字段,避免索引越界 if len(columns) >= 3: result_data.append({ "提取值": columns[2], "门店号": store_number }) # 转为DataFrame并输出CSV df = pd.DataFrame(result_data) df.to_csv(f"{store_number}_输出.csv", index=False) return df # 调用示例 process_single_psa("1 Area 2 - store 15 group.psa")
压缩包内批量处理代码
如果需要处理压缩包中的所有PSA文件,使用zipfile模块遍历文件:
import zipfile def process_zip_psa(zip_file_path): all_results = [] with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: # 遍历压缩包内所有文件 for file_name in zip_ref.namelist(): # 只处理.psa后缀的文件 if file_name.endswith('.psa'): # 提取门店号 store_match = re.search(r'store (\d+)', file_name) store_number = store_match.group(1) if store_match else "未知门店" # 读取压缩包内的文件内容 with zip_ref.open(file_name) as f: for line in f: # 字节流转字符串 stripped_line = line.decode('utf-8').strip() if stripped_line.startswith('prod'): columns = stripped_line.split(',') if len(columns) >= 3: all_results.append({ "提取值": columns[2], "门店号": store_number }) # 合并所有结果并输出总CSV final_df = pd.DataFrame(all_results) final_df.to_csv("批量处理结果.csv", index=False) return final_df # 调用示例 process_zip_psa("门店数据压缩包.zip")
关键优化点说明
- 直接处理PSA文件:跳过TXT转换步骤,直接读取逗号分隔的PSA内容
- 精准行筛选:通过
startswith('prod')过滤目标行,避免无关数据混入 - 安全列提取:先判断行字段数量,防止索引越界报错
- 正则提取门店号:用正则表达式
store (\d+)精准匹配文件名中的门店数字,兼容不同格式的文件名
内容的提问来源于stack exchange,提问作者uranis
相关产品推荐
相关产品推荐

