用python读取.doc文件

时间:2016-03-15 02:11:09

标签: python python-2.7

我得到了求职申请,我的交易是读了一些.doc文件。有谁知道图书馆这样做?我开始使用原始python代码:

f = open('test.doc', 'r')
f.read()

但这不会返回我需要将其转换为utf-8

的友好字符串

编辑:我只想获取此文件中的文字

8 个答案:

答案 0 :(得分:16)

可以使用textract库。 它会照顾" doc"以及" docx"

import textract
text = textract.process("path/to/file.extension")

你甚至可以使用' antiword' (sudo apt-get install antiword)然后将doc转换为docx,然后通过docx2txt阅读。

antiword filename.doc > filename.docx

最终,后端的textract正在使用反词。

答案 1 :(得分:11)

您可以使用python-docx2txt库从Microsoft Word文档中读取文本。这是对python-docx库的改进,因为它可以从链接,页眉和页脚中提取文本。它甚至可以提取图像。

您可以通过运行pip install docx2txt安装它。

让我们下载并阅读here上的第一个Microsoft文档:

import docx2txt
my_text = docx2txt.process("test.docx")
print(my_text)

以下是终端输出上面代码的截图:

enter image description here

修改

NOT .doc 文件有效。我保留这个答案的唯一原因是,似乎有人发现它对 .docx 文件很有用。

答案 2 :(得分:6)

我试图这样做,我发现了很多关于阅读.docx的信息,但更少关于.doc;无论如何,我设法使用以下内容阅读文本:

import win32com.client

word = win32com.client.Dispatch("Word.Application")
word.visible = False
wb = word.Documents.Open("myfile.doc")
doc = word.ActiveDocument
print(doc.Range().Text)

答案 3 :(得分:1)

先决条件:

安装反词:sudo apt-get install antiword

安装docx:pip install docx

from subprocess import Popen, PIPE

from docx import opendocx, getdocumenttext
from cStringIO import StringIO
def document_to_text(filename, file_path):
    cmd = ['antiword', file_path]
    p = Popen(cmd, stdout=PIPE)
    stdout, stderr = p.communicate()
    return stdout.decode('ascii', 'ignore')

print document_to_text('your_file_name','your_file_path')

注意 - 新版本的python-docx删除了这个功能。确保pip install docx而不是新的python-docx

答案 4 :(得分:1)

Shivam Kotwalia的回答非常有效。但是,对象是作为 byte 类型导入的。有时您可能需要它作为执行REGEX或类似功能的字符串。

我推荐以下代码(Shivam Kotwalia的回答两行):

<!DOCTYPE html>
<html>

<head>
	<meta charset = "utf-8">
	<title>Increment Button</title>
</head>

<body>

<button onclick="IncrementScore()"> Increment</button>

<script>
	var score = 0;
	
	function IncrementScore()
	{
		score++;
	}
	
	console.log(score);
</script>
</body>


</html>

最后一行将对象 text 转换为 string

答案 5 :(得分:0)

除了Windows中不存在 textract 之外,我同意Shivam的回答。 并且,由于某些原因,反字词也无法读取'.doc'文件并给出错误:

'filename.doc' is not a word document. # This happens when the file wasn't generated via MS Office. Eg: Web-pages may be stored in .doc format offline.

因此,我有以下变通方法来提取文本:

from bs4 import BeautifulSoup as bs
soup = bs(open(filename).read())
[s.extract() for s in soup(['style', 'script'])]
tmpText = soup.get_text()
text = "".join("".join(tmpText.split('\t')).split('\n')).encode('utf-8').strip()
print text

此脚本将适用于大多数文件。 玩得开心!

答案 6 :(得分:0)

我不得不用同样的方法在大量 *.doc 文件中搜索特定数字并得出:

special_chars = {
    "b'\\t'": '\t',
    "b'\\r'": '\n',
    "b'\\x07'": '|',
    "b'\\xc4'": 'Ä',
    "b'\\xe4'": 'ä',
    "b'\\xdc'": 'Ü',
    "b'\\xfc'": 'ü',
    "b'\\xd6'": 'Ö',
    "b'\\xf6'": 'ö',
    "b'\\xdf'": 'ß',
    "b'\\xa7'": '§',
    "b'\\xb0'": '°',
    "b'\\x82'": '‚',
    "b'\\x84'": '„',
    "b'\\x91'": '‘',
    "b'\\x93'": '“',
    "b'\\x96'": '-',
    "b'\\xb4'": '´'
}


def get_string(path):
    string = ''
    with open(path, 'rb') as stream:
        stream.seek(2560) # Offset - text starts after byte 2560
        current_stream = stream.read(1)
        while not (str(current_stream) == "b'\\xfa'"):
            if str(current_stream) in special_chars.keys():
                string += special_chars[str(current_stream)]
            else:
                try:
                    char = current_stream.decode('UTF-8')
                    if char.isalnum():
                        string += char
                except UnicodeDecodeError:
                    string += ''
            current_stream = stream.read(1)
    return string

我不确定这个解决方案有多“干净”,但它适用于正则表达式。

答案 7 :(得分:0)

我一直在寻找解决方案。 .doc文件资料不够,最后我把.doc类型改成.docx

解决了这个问题
from win32com import client as wc
w = wc.Dispatch('Word.Application')
# Or use the following method to start a separate process:
# w = wc.DispatchEx('Word.Application')
doc=w.Documents.Open(os.path.abspath('test.doc'))
doc.SaveAs("test_docx.docx",16)