使用pywin32从MS Word中提取数据

时间:2013-11-26 20:12:48

标签: python ms-word pywin32

我在Windows中运行python 3.3,我需要从Word文档中提取字符串。我一直在寻找一周左右的最佳方法来做到这一点。最初我试图将.docx文件保存为.txt并使用RE解析,但我有一些隐藏字符的格式问题 - 我使用脚本打开.docx并另存为.txt。我想知道我是否做了一个正确的文件> SaveAs> .txt它会删除奇怪的格式然后我可以正确解析通过?我不知道,但我放弃了这种方法。

我尝试使用docx module,但我被告知它与python 3.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)

所以在这一点上我可以做类似

的事情
print(doc.Content.Text) 

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

我到目前为止的代码主要是通过Google找到的。我甚至不认为这很难,只是通过微软网站上的对象模型阅读就像读外语一样。任何帮助深表感谢。谢谢。

编辑:我用来将文件从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()

2 个答案:

答案 0 :(得分:3)

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

这里有很多选择。使用tempfile创建临时文本文件然后删除它们,或者将永久文本文件与doc文件一起存储以供以后重复使用?使用Unicode(在Microsoft中,它表示带有BOM的UTF-16-LE)或编码文本?等等。所以,我只会选择合理的内容,然后您可以查看Document.SaveAsWdSaveFormat等文档来修改它。

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有很好的解析器。 (BeautifulSoup表格比win32com-Word更容易。)

答案 1 :(得分:0)

oodocx是我的python-docx模块的分支,它与Python 3.3完全兼容。您可以使用replace方法进行正则表达式搜索。您的代码看起来像:

from oodocx import oodocx

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

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