关于Python提取.egp文件中SAS脚本不全及其他读取.egp文件方法的咨询
关于Python提取.egp文件中SAS脚本不全及其他读取.egp文件方法的咨询
问题1:为什么只提取出第一个SAS脚本?
仔细看了你的代码,问题出在文件名覆盖上!
EGP本质是个ZIP归档包,里面的SAS脚本可能存放在不同的子目录里,比如归档内可能同时存在core/extract_data.sas和utils/extract_data.sas这类文件——它们的基础文件名都是extract_data.sas。你的代码用os.path.basename(file_info.filename)生成提取后的文件名,这就导致后面提取的同名文件会直接覆盖之前的,最终_extracted文件夹里看起来只剩“第一个”,但实际上是最后一个覆盖了前面所有同名文件的结果。
修复方案:
有两种简单的解决思路,选哪种看你的实际需求:
思路1:保留归档内的目录结构(推荐)
这样能完全还原EGP里的脚本组织逻辑,还从根源上避免重名覆盖问题:
# 替换原来生成extracted_path的代码 extracted_path = os.path.join(extraction_dir, file_info.filename) # 自动创建所需的子目录,避免写入文件时报错 os.makedirs(os.path.dirname(extracted_path), exist_ok=True)
思路2:给重名文件自动加序号
如果你不想保留子目录,只想把所有脚本放在同一文件夹下,可以给重复的文件名加递增序号:
base_name = os.path.basename(file_info.filename) name, ext = os.path.splitext(base_name) extracted_path = os.path.join(extraction_dir, base_name) # 检查文件是否存在,重复就追加序号 counter = 1 while os.path.exists(extracted_path): extracted_path = os.path.join(extraction_dir, f"{name}_{counter}{ext}") counter += 1
问题2:其他读取EGP文件的方法?
EGP本身就是标准ZIP文件,用zipfile处理是最轻量化、跨平台的方案,我再给你补充几个实用的思路:
- 无需提取到本地文件:如果你的需求只是读取脚本内容做分析(比如扫描关键字、统计代码行数),完全不用生成
_extracted文件夹,直接在内存里读取内容就行,能大幅提升处理速度,还能节省磁盘空间:def extract_sas_scripts_from_egp_no_disk(file_path): scripts = [] with zipfile.ZipFile(file_path, 'r') as archive: for file_info in archive.infolist(): if file_info.filename.endswith(".sas"): with archive.open(file_info) as sas_file: content = sas_file.read().decode('latin-1') scripts.append((content, file_info.filename)) return scripts - SAS官方工具调用(限有EG环境的情况):如果你本地安装了SAS Enterprise Guide,可以通过SAS的COM自动化接口调用EG导出所有脚本,但这个方法依赖Windows系统和EG安装环境,通用性远不如
zipfile方案。 - 批量处理优化:如果要处理成百上千个EGP文件,建议不要每个文件都生成单独的
_extracted文件夹,可以统一用一个临时目录,处理完单个文件就清理,避免磁盘空间被大量临时文件占用。
备注:内容来源于stack exchange,提问作者Freddy
相关产品推荐
相关产品推荐

