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

如何提取.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:12:50