我只关心从.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的替代品)
我不确定,但我认为问题是olefile不了解Word文档,只有OLE“流”。所以我猜你提取的数据不仅仅包含纯文本,还有某种控制字符。所以我猜这就是为什么你不能解码你得到的数据为utf-16。
有一些Python模块可以从doc文件转换,但它们只适用于Linux,它们使用命令行实用程序antiword
或catdoc
。
我尝试了其他前进的道路 - 如果问题是你没有Word的许可证,但是否则可以安装软件,LibreOffice可能是一条前进的道路。使用此命令,我将包含doc格式的中文字母的Word测试文件转换为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()