문제

작업에 대한 MS 워드 파일에서는 python,가 python win32 확장,사용될 수 있습니다.나는 어떻게 같은 리눅스에서는?이 있습니다.

도움이 되었습니까?

해결책

하위 프로세스 호출을 할 수 있습니다 안티 워드. Antiword는 Word Doc에서 텍스트를 덤프하기위한 Linux Commandline 유틸리티입니다. 간단한 문서에 대해 잘 작동합니다 (분명히 서식을 잃습니다). APT를 통해 사용할 수 있으며 아마도 RPM으로 제공되거나 직접 컴파일 할 수 있습니다.

다른 팁

사용 기본 Python DOCX 모듈. 문서에서 모든 텍스트를 추출하는 방법은 다음과 같습니다.

document = docx.Document(filename)
docText = '\n\n'.join([
    paragraph.text.encode('utf-8') for paragraph in document.paragraphs
])
print docText

보다 Python Docx 사이트

또한 체크 아웃하십시오 Textract 테이블 등을 끌어 당깁니다.

Regexs와 함께 XML을 구문 분석하면 Cthulu가 호출됩니다. 하지 마세요!

베냐민의 대답은 꽤 좋은 것입니다. 방금 통합했습니다 ...

import zipfile, re

docx = zipfile.ZipFile('/path/to/file/mydocument.docx')
content = docx.read('word/document.xml').decode('utf-8')
cleaned = re.sub('<(.|\n)*?>','',content)
print(cleaned)

OpenOffice.org는 Python으로 스크립트를 작성할 수 있습니다. 여기를 봐.

OOO는 대부분의 MS Word 파일을 완벽하게로드 할 수 있으므로 이것이 최선의 방법이라고 말합니다.

나는 이것이 오래된 질문이라는 것을 알고 있지만 최근에 MS Word 파일에서 텍스트를 추출하는 방법을 찾으려고 노력했으며 지금까지 가장 좋은 솔루션은 wvlib입니다.

http://wvware.sourceforge.net/

라이브러리를 설치 한 후 파이썬에서 사용하는 것은 매우 쉽습니다.

import commands

exe = 'wvText ' + word_file + ' ' + output_txt_file
out = commands.getoutput(exe)
exe = 'cat ' + output_txt_file
out = commands.getoutput(exe)

그리고 그게 다야. 우리가하고있는 일은 명령을 사용하여 wvtext (Word 문서에서 텍스트를 추출하고 파일 출력을 읽는 CAT)를 실행하기 위해 명령을 사용하는 것입니다. 그 후, Word 문서의 전체 텍스트는 사용할 준비가되며 사용할 수 있습니다.

바라건대 이것은 미래에 비슷한 문제가있는 사람에게 도움이 될 것입니다.

보세요 DOC 형식의 작동 방식 그리고 Linux에서 PHP를 사용하여 Word 문서를 만듭니다. 전자는 특히 유용합니다. abiword 권장 도구입니다. 거기 있습니다 제한 그렇지만:

그러나 문서에 복잡한 테이블, 텍스트 상자, 내장 스프레드 시트 등이있는 경우 예상대로 작동하지 않을 수 있습니다. 좋은 MS Word 필터를 개발하는 것은 매우 어려운 과정이므로 Word 문서를 올바르게 열 수 있도록 노력하면서 우리와 함께하십시오. 로드하지 않는 Word 문서가있는 경우 버그를 열고 문서를 포함하여 수입업자를 개선 할 수 있습니다.

(참고 : 이것을 게시했습니다 이 질문 또한 여기서는 관련이있는 것 같습니다. 다시 게시하십시오.)

이제 이것은 꽤 못 생겼고 꽤 해킹되지만 기본 텍스트 추출에 저에게 효과가있는 것 같습니다. 분명히 이것을 QT 프로그램에서 사용하려면 프로세스 등을 스폰해야하지만 해킹 한 명령 줄은 다음과 같습니다.

unzip -p file.docx | grep '<w:t' | sed 's/<[^<]*>//g' | grep -v '^[[:space:]]*$'

그래서 그건:

unzip -p file.docx: -p == "zip to stdout"

grep ': 포함 된 선만 잡아 u003Cw:t' (u003Cw:t> 내가 알 수있는 한 "텍스트"에 대한 2007 XML 요소라는 단어)

sed 's/<[^<> // g '*: 태그 내부의 모든 것을 제거합니다.

grep -v '^[[: Space :]$ '*: 빈 줄을 제거하십시오

더 효율적인 방법이있을 가능성이 있지만, 테스트 한 몇 가지 문서에서 저에게 효과가있는 것 같습니다.

내가 알고있는 한, 꺼짐, grep 및 sed는 모두 Windows와 Unix 용 포트를 가지고 있으므로 합리적으로 교차 플랫폼이어야합니다. 약간의 추악한 해킹이되기 위해;)

하위 프로세스를 호출하지 않고 순수한 파이썬 모듈을 사용하려는 의도가 있다면 ZipFile Python Modude를 사용할 수 있습니다.

content = ""
# Load DocX into zipfile
docx = zipfile.ZipFile('/home/whateverdocument.docx')
# Unpack zipfile
unpacked = docx.infolist()
# Find the /word/document.xml file in the package and assign it to variable
for item in unpacked:
    if item.orig_filename == 'word/document.xml':
        content = docx.read(item.orig_filename)

    else:
        pass

그러나 콘텐츠 문자열을 정리해야합니다.이 작업을 수행하는 한 가지 방법은 다음과 같습니다.

# Clean the content string from xml tags for better search
fullyclean = []
halfclean = content.split('<')
for item in halfclean:
    if '>' in item:
        bad_good = item.split('>')
        if bad_good[-1] != '':
            fullyclean.append(bad_good[-1])
        else:
            pass
    else:
        pass

# Assemble a new string with all pure content
content = " ".join(fullyclean)

그러나 아마도 RE 모듈을 사용하여 문자열을 정리하는 더 우아한 방법이 있습니다. 도움이 되었기를 바랍니다.

Unoconv는 또한 좋은 대안 일 수 있습니다. http://linux.die.net/man/1/unoconv

libreoffice가 설치되어 있다면 명령 줄에서 호출하여 파일을 텍스트로 변환 할 수 있습니다., 그런 다음 텍스트를 파이썬에로드하십시오.

COM을 사용하지 않고 많은 운이 될지 확실하지 않습니다. .doc 형식은 엄청나게 복잡하며 저장시 단어의 "메모리 덤프"라고 불립니다!

Swati에서는 HTML에 있습니다. 괜찮고 멋지지만 대부분의 Word 문서는 그리 좋지 않습니다!

.docx 파일을 포함한 Word 2007 이상 파일을 읽으려면 Python-docx 패키지:

from docx import Document
document = Document('existing-document-file.docx')
document.save('new-file-name.docx')

Word 2003 이상에서 .doc 파일을 읽으려면 하위 프로세스 호출을하십시오. 안티 워드. 먼저 Antiword를 설치해야합니다.

sudo apt-get install antiword

그런 다음 Python 스크립트에서 호출하십시오.

import os
input_word_file = "input_file.doc"
output_text_file = "output_file.txt"
os.system('antiword %s > %s' % (input_word_file, output_text_file))

이전나요?내가 믿는 것은 존재하지 않습니다.가 대답하고 답이 없는 것들입니다.이것은 답이 없는,또는 반 응답하고자하는 경우.론,방법에 대한 독*.docx(MS Word2007 이상)문서를 사용하지 않고 COM 모두 적용됩니다.그러나 방법에서 텍스트를 추출*.doc(MS Word97-2000 과),사용하는 파이썬만,부족하다.은 이 복잡해?하:정말,이해하기:글쎄,그 다른 것입니다.

지 못할 때에 찾아 모든 완성된 코드를 읽 일부 형식의 사양서 파는 몇 가지 제안된 알고리즘을 다른 언어로도 제공됩니다.

MS Word(*.doc)파일이 있는 OLE2 화합물은 파일입니다.지 않을 귀찮게 많이 당신의 불필요한 세부 사항,생각으로 그것의 파일 시스템 파일에 저장됩니다.그것이 실제로 사용하지방 구조물,이렇게 정의를 보유하고 있습니다.(Hm,어쩌면 당신이 할 수있는 루프에 탑재 Linux???) 이 방법으로 저장할 수 있습니다 더 많은 파일이 파일 내에서처럼,그림 등입니다.동일 수 있습니다.docx 지퍼를 사용하여 아카이브 대신 합니다.패키지에서 사용할 수 PyPI 읽을 수 있는 OLE 파일이 있습니다.다음과 같(olefile,compoundfiles,...) 내가 사용하는 compoundfiles 패키지를 열려면*.doc 파일입니다.그러나 MS Word 에서 97-2000 과,내부 subfiles 지 또는 XML HTML,그러나 바이너리 파일이 있습니다.과 같이 충분하지 않습니다,각 포함하에 대한 정보를 다른 하나는,그래서 당신은 당신을 읽어야에서는 적어도 두 개 이상의 그들을 풀어 저장된 정보에 따라.완전히 이해하,읽는 PDF 문서에서 나는 알고리즘이 있습니다.

아래 코드는 것은 매우 급하게 구성된 테스트에 적은 수의 파일이 있습니다.로 볼 수 있습니다,그것으로 작동합니다.때로는 몇 가지 횡설수설에 나타나 시작하고,거의 항상의 끝에서 텍스트입니다.이 있을 수 있습니다 몇 가지 이상한도 캐릭터가 사뿐만 아니라.

그들이 원하는 텍스트를 검색하려면 행복할 것이다.여전히,여러분은 사람을 개선하는 데 도움이 될 수 있 이 코드를니다.


doc2text module:
"""
This is Python implementation of C# algorithm proposed in:
http://b2xtranslator.sourceforge.net/howtos/How_to_retrieve_text_from_a_binary_doc_file.pdf

Python implementation author is Dalen Bernaca.
Code needs refining and probably bug fixing!
As I am not a C# expert I would like some code rechecks by one.
Parts of which I am uncertain are:
    * Did the author of original algorithm used uint32 and int32 when unpacking correctly?
      I copied each occurence as in original algo.
    * Is the FIB length for MS Word 97 1472 bytes as in MS Word 2000, and would it make any difference if it is not?
    * Did I interpret each C# command correctly?
      I think I did!
"""

from compoundfiles import CompoundFileReader, CompoundFileError
from struct import unpack

__all__ = ["doc2text"]

def doc2text (path):
    text = u""
    cr = CompoundFileReader(path)
    # Load WordDocument stream:
    try:
        f = cr.open("WordDocument")
        doc = f.read()
        f.close()
    except: cr.close(); raise CompoundFileError, "The file is corrupted or it is not a Word document at all."
    # Extract file information block and piece table stream informations from it:
    fib = doc[:1472]
    fcClx  = unpack("L", fib[0x01a2l:0x01a6l])[0]
    lcbClx = unpack("L", fib[0x01a6l:0x01a6+4l])[0]
    tableFlag = unpack("L", fib[0x000al:0x000al+4l])[0] & 0x0200l == 0x0200l
    tableName = ("0Table", "1Table")[tableFlag]
    # Load piece table stream:
    try:
        f = cr.open(tableName)
        table = f.read()
        f.close()
    except: cr.close(); raise CompoundFileError, "The file is corrupt. '%s' piece table stream is missing." % tableName
    cr.close()
    # Find piece table inside a table stream:
    clx = table[fcClx:fcClx+lcbClx]
    pos = 0
    pieceTable = ""
    lcbPieceTable = 0
    while True:
        if clx[pos]=="\x02":
            # This is piece table, we store it:
            lcbPieceTable = unpack("l", clx[pos+1:pos+5])[0]
            pieceTable = clx[pos+5:pos+5+lcbPieceTable]
            break
        elif clx[pos]=="\x01":
            # This is beggining of some other substructure, we skip it:
            pos = pos+1+1+ord(clx[pos+1])
        else: break
    if not pieceTable: raise CompoundFileError, "The file is corrupt. Cannot locate a piece table."
    # Read info from pieceTable, about each piece and extract it from WordDocument stream:
    pieceCount = (lcbPieceTable-4)/12
    for x in xrange(pieceCount):
        cpStart = unpack("l", pieceTable[x*4:x*4+4])[0]
        cpEnd   = unpack("l", pieceTable[(x+1)*4:(x+1)*4+4])[0]
        ofsetDescriptor = ((pieceCount+1)*4)+(x*8)
        pieceDescriptor = pieceTable[ofsetDescriptor:ofsetDescriptor+8]
        fcValue = unpack("L", pieceDescriptor[2:6])[0]
        isANSII = (fcValue & 0x40000000) == 0x40000000
        fc      = fcValue & 0xbfffffff
        cb = cpEnd-cpStart
        enc = ("utf-16", "cp1252")[isANSII]
        cb = (cb*2, cb)[isANSII]
        text += doc[fc:fc+cb].decode(enc, "ignore")
    return "\n".join(text.splitlines())

com을 사용하지 않고 'doc'파일을 읽는 옵션 만 있습니다. 미트. 모든 플랫폼에서 작동해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top