我只关心从.doc文件中获取文本。我在Windows 10上使用python 3.6,因此textract / antiword不在桌面上。我查看了this question中的其他参考,但是它们都比较旧并且与Windows 10和/或python 3.6不兼容。
我的文档是一个中文和英文混合的.doc文件。我不熟悉Word如何存储其文件,并且我的计算机上没有Word。使用olefile,我可以获取文档的字节,但是我不知道如何正确遍历标题和布局以提取文本。如果我天真尝试
from olefile import OleFileIO as ofio
ole = ofio('d.doc')
stream = ole.openstream('WordDocument')
data = stream.read()
data.decode('utf-16')
>>>UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 9884-9885: illegal encoding
data[9884:9885]
>>>b'\xfa'
data[:9884].decode('utf-16')
然后,最后一行给了我大约一半的文档,以很多垃圾字符开头和结尾。我怀疑我可以继续尝试使用这种方法来逐段获取文本,但最终我需要对许多文件执行此操作。即使我这样做,也无法想到自动化它的好方法。如何使用olefile从.doc中可靠地获取文本?
(如果您知道可以使用我的规范的话,也可以在答案中包括olefile的替代项)
答案 0 :(得分:0)
我不确定,但是我认为问题在于olefile不了解Word文档,只有OLE“流”。因此,我想您提取的数据不仅包含纯文本,还包含某种控制字符。因此,我想这就是为什么您无法解码以utf-16格式获取的数据的原因。
有些Python模块可以从doc文件转换,但是它们往往仅在使用命令行实用程序antiword
或catdoc
的Linux上工作。
我尝试了其他方法-如果问题是您没有Word的许可证,但可以安装软件,则LibreOffice可能是一种方法。使用此命令,我将具有中文字母的Word测试文件从 doc 格式转换为 HTML :
"c:\Program Files\LibreOffice\program\swriter.exe" --convert-to html d.doc
LibreOffice也可以转换为许多其他格式,但是HTML应该足够简单以便进一步处理。我也尝试过a port of catdoc
to Windows,但无法处理中文字母。
import win32com.client
app = win32com.client.Dispatch("Word.Application")
try:
app.visible = False
wb = app.Documents.Open('c:/temp/d.doc')
doc = app.ActiveDocument
with open('out.txt', 'w', encoding = 'utf-16') as f:
f.write(doc.Content.Text)
except Exception as e:
print(e)
finally:
app.Quit()