我只关心从.doc文件中获取文本。我在windows 10上使用python3.6,所以textract/antiword就不在桌面上了。我查看了来自这个问题的其他引用,但它们都是旧的,并且与windows 10和/或python3.6不兼容。
我的文档是一个.doc文件,中英混合。我不熟悉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')
最后一行给出了大约一半的文档,以大量垃圾字符开头和结尾。我怀疑我可以继续尝试这个方法来一片片地获取文本,但是我最终需要对很多文件这样做。即使我是这样做的,我也想不出一个好的方法来实现它的自动化。如何使用烯烃文件可靠地从.doc中获取文本?
(如果你知道有一种方法适用于我的规范,那么也可以在你的答案中加入烯烃的替代品)。
发布于 2018-08-21 11:57:03
我不确定,但我认为问题在于烯烃对Word文档没有理解,只有OLE "streams“。因此,我想,您提取的数据中包含的不只是纯文本,而是某种类型的控制字符。所以我想这就是为什么你不能把你得到的数据解码为UTF-16。
有一些Python模块可以从文档文件中转换,但是它们倾向于只在Linux上工作,在那里它们使用命令行实用程序antiword
或catdoc
。
我尝试了其他解决方案--如果问题是您没有Word许可,但可以安装软件,LibreOffice可能是一条前进的道路。使用此命令,我将一个包含中文字母的Word测试文件从doc格式转换为HTML。
"c:\Program Files\LibreOffice\program\swriter.exe" --convert-to html d.doc
LibreOffice也可以转换成许多其他格式,但是HTML应该足够简单,可以进一步处理。我也试过转到Windows,但我无法用它来处理中文信件。
不幸的是,你没有安装Word,或者你可以让它为你做工作。将该解决方案留在这里,以防其他人使用该解决方案:
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()
https://stackoverflow.com/questions/51943121
复制相似问题