我需要找到存储在doc / docx文件中的特定文本,并将其转储到csv中。我的约束是:
a)doc / docx文件位于压缩存档中:我无法写入磁盘/我需要在内存中工作
b)我需要使用正则表达式查找特定文本,因此需要将doc / docx转换为.txt
理想情况下,我可以使用zipfile读取文件,将数据传递到某些doc-to-txt转换器(textract,docx2txt等),并在txt上使用正则表达式。可能看起来像
import zipfile
import textract
import re
with zipfile.ZipFile(zip_archive, 'r') as f:
for name in f.namelist():
data = f.read(name)
txt = textract.process(data).decode('utf-8')
#some regex on txt
这当然是行不通的,因为textract(以及任何其他doc(x)-to-txt转换器)的参数是文件路径,而“数据”是字节。使用“名称”作为自变量会给出MissingFileError,这可能是因为zip归档文件没有目录结构,而只是文件名模拟了路径。
是否有任何方法可以仅在内存中通过压缩的doc / docx文件进行正则表达式,而无需提取文件(并因此将它们写入磁盘)?
据我所知,用zipfile打开一个zip文件不会导致它将未压缩的文件写入任何临时文件。所以这应该全部在内存中。
import re
import zipfile
zf = zipfile.ZipFile('/temp/example.docx')
data = xmltodict.parse(zf.open('word/document.xml'))
some_text = text = data['w:document']['w:body']['w:p'][46]['w:r']['w:t']
print(some_text)
这里是MS的XML文件格式的参考:https://docs.microsoft.com/en-us/openspecs/office_standards/ms-docx/b839fe1f-e1ca-4fa6-8c26-5954d0abbccd