用pywin32从MS-Word中提取数据

2024-03-28 16:50:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows中运行python3.3,需要从Word文档中提取字符串。一个星期以来,我一直在寻找最好的方法。最初我试图将.docx文件保存为.txt并使用RE进行解析,但是我在隐藏字符的格式设置上遇到了一些问题-我使用一个脚本打开.docx并另存为.txt。我想知道我是否做了一个正确的文件>;SaveAs>;.txt,它会去掉奇怪的格式,然后我可以正确地解析?我不知道,但我放弃了这个方法。在

我试图使用docx module,但有人告诉我它与python3.3不兼容。所以我只能使用pywin32和COM。我已经成功地用Excel来获得我需要的数据,但是我在Word上遇到了麻烦,因为文档太少了,而且微软网站上的reading through the object model太难了。在

以下是迄今为止我打开文档的方法:

import win32com.client as win32
import glob, os

word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = True

for infile in glob.glob(os.path.join(r'mypath', '*.docx')):
    print(infile)
    doc = word.Documents.Open(infile)

所以现在我可以做一些类似的事情

^{pr2}$

看看这些文件的内容,但看起来还是有一些奇怪的格式,我不知道如何真正地通过解析来获取我需要的数据。我可以创建RE,它将成功地找到我正在寻找的字符串,我只是不知道如何使用COM将它们实现到程序中。在

到目前为止,我所掌握的代码大多是通过谷歌找到的。我甚至不认为这有那么难,只是通过微软网站上的对象模型阅读就像阅读一门外语。任何帮助都是非常感谢的。谢谢您。在

编辑:我用来将文件从docx保存到txt的代码:

for path, dirs, files in os.walk(r'mypath'):
    for doc in [os.path.abspath(os.path.join(path, filename)) for filename in files if fnmatch.fnmatch(filename, '*.docx')]:
        print("processing %s" % doc)
        wordapp.Documents.Open(doc)
        docastxt = doc.rstrip('docx') + 'txt'
        wordapp.ActiveDocument.SaveAs(docastxt,FileFormat=win32com.client.constants.wdFormatText)
        wordapp.ActiveDocument.Close()

Tags: 文件path方法intxtfordocos
2条回答

如果您不想了解Word建模文档的复杂方式,以及如何通过Office对象模型公开文档,那么一个更简单的解决方案是让Word保存文件的纯文本副本。在

这里有很多选择。使用tempfile创建临时文本文件,然后将其删除,还是将永久文本文件与doc文件一起存储,以便以后重复使用?使用Unicode(在微软的说法中,这意味着带有BOM的UTF-16-LE)或编码文本?等等。所以,我只选择一些合理的,您可以查看^{}^{}等文档来修改它。在

wdFormatUnicodeText = 7

for infile in glob.glob(os.path.join(r'mypath', '*.docx')):
    print(infile)
    doc = word.Documents.Open(infile)
    txtpath = os.path.splitext('infile')[0] + '.txt'
    doc.SaveAs(txtpath, wdFormatUnicodeText)
    doc.Close()
    with open(txtpath, encoding='utf-16') as f:
        process_the_file(f)

正如您在评论中所指出的,这对复杂事物(如表、多列文本等)所做的可能并不完全是您想要的。在这种情况下,您可能需要考虑另存为,例如,wdFormatFilteredHTML,Python有很好的解析器来处理这个问题。(与win32com Word It相比,美化一个表要容易得多。)

oodocx是pythondocx模块的分支,它与python3.3完全兼容。方法可以用正则表达式代替。你的代码看起来像:

from oodocx import oodocx

d = oodocx.Docx('myfile.docx')
d.replace('searchstring', 'replacestring')
d.save('mynewfile.docx')

如果只想删除字符串,可以将空字符串传递给“replace”参数。在

相关问题 更多 >