Python解析.ole文件的方法及DOORS导出reqifz中.ole文件无法被olefile识别的问题求助
Python解析.ole文件的方法及DOORS导出reqifz中.ole文件无法被olefile识别的问题求助
我之前也碰到过类似的坑,尤其是从DOORS导出的REQIFZ包里的OLE文件,经常不按标准套路来,导致olefile模块直接认不出来。给你梳理下可能的原因和可以尝试的解决方向:
可能的原因
- OLE文件被RTF容器包裹:你提到导入Polarion后生成了
.ole.rtf,而且里面实际包含OLE对象。这说明DOORS导出的.ole文件可能不是纯OLE格式,而是被RTF包装过的。olefile的isOleFile()是靠检查文件头的标准OLE魔术标识(D0 CF 11 E0 A1 B1 1A E1)来判断的,如果文件前面带了RTF的内容,自然识别失败。 - DOORS对OLE做了私有扩展:有些工具厂商会给标准OLE格式加自己的元数据前缀或者私有结构,导致标准库识别不了。
可以尝试的解决步骤
- 先检查文件头:用二进制编辑器(比如Notepad++的Hex Editor插件)打开你的.ole文件,看开头几个字节是不是标准OLE的魔术头。如果不是,那大概率是前面有RTF的内容(RTF开头一般是
{\rtf)。 - 剥离RTF提取纯OLE对象:如果文件是RTF包裹的,得先把OLE部分单独提出来。可以试试用RTF解析库处理,比如
rtf或者python-docx(间接处理RTF中的OLE);也可以手动找RTF里的OLE标记(比如\objemb相关段落),然后提取对应的二进制块。 - 换用其他OLE处理库:如果olefile兼容性不够,试试
oletools套件或者pywin32的win32com.client(仅限Windows环境)。比如用oletools的olevba工具扫一下文件,看能不能识别出OLE结构。 - 重新解压REQIFZ文件:有时候解压工具对REQIFZ的特殊结构处理不好,会导致文件损坏。可以试试用Polarion自带的工具或者专门的REQIF处理工具重新解压,再检查.ole文件是否正常。
实用代码片段示例
如果手动剥离太麻烦,可以直接从Polarion生成的.ole.rtf里提取OLE对象。比如用rtf库(先执行pip install rtf安装):
import rtf import olefile # 从.ole.rtf中提取OLE对象 with open('your_file.ole.rtf', 'rb') as rtf_file: doc = rtf.Reader(rtf_file) for idx, obj in enumerate(doc.objects): # 保存提取出的纯OLE文件 extracted_ole_path = f'extracted_ole_{idx}.ole' with open(extracted_ole_path, 'wb') as ole_file: ole_file.write(obj.data) # 验证是否能被olefile识别 print(f"提取的文件 {extracted_ole_path} 是否为OLE文件: {olefile.isOleFile(extracted_ole_path)}")
不过要注意,有些RTF里的OLE可能还有额外封装头,这时候可能需要对照标准OLE结构手动调整下提取的数据。
内容来源于stack exchange




