web-dev-qa-db-fra.com

Comment extraire du texte d'un fichier docx existant à l'aide de python-docx

J'essaie d'utiliser le module python-docx (pip install python-docx) Mais cela semble être très déroutant, car dans github repo test, ils utilisent la fonction opendocx mais dans readthedocs ils utilisent la classe Document. Même s'ils ne font que montrer comment ajouter du texte à un fichier docx ne lisant pas un fichier existant?

La première (opendocx) ne fonctionne pas, peut être déconseillée. Pour le second cas, j'essayais d'utiliser:

from docx import Document

document = Document('test_doc.docx')

print document.paragraphs

Il a renvoyé une liste de <docx.text.Paragraph object at 0x... > 

Puis j'ai fait:

for p in document.paragraphs:
    print p.text

Il a renvoyé tout le texte mais il manquait peu de chose. Toutes les URL (CTRL + CLIQUER pour accéder à l'URL) n'étaient pas présentes dans le texte de la console.

Quelle est la solution? Pourquoi les URL sont manquantes?

Comment obtenir un texte complet sans parcourir la boucle (quelque chose comme open().read()

28
Nancy

tu peux essayer ça

import docx

def getText(filename):
    doc = docx.Document(filename)
    fullText = []
    for para in doc.paragraphs:
        fullText.append(para.text)
    return '\n'.join(fullText)
31
Chinmoy Panda

Vous pouvez utiliser python-docx2txt qui est adapté de python-docx mais peut également extraire du texte à partir de liens, d’en-têtes et de pieds de page. Il peut également extraire des images. 

8
Ankush Shah

Sans installer python-docx

docx est fondamentalement un fichier Zip contenant plusieurs dossiers et fichiers. Dans le lien ci-dessous, vous trouverez une fonction simple permettant d'extraire le texte du fichier docx, sans qu'il soit nécessaire d'installer python-docx et lxml, ce qui pose parfois problème:

http://etienned.github.io/posts/extract-text-from-Word-docx-simply/

6
imanzabet

Il y a deux "générations" de python-docx. La génération initiale s'est terminée avec les versions 0.2.x et la "nouvelle" génération a démarré à la version 0.3.0. La nouvelle génération est une réécriture de la version héritée, orientée objet. Il a un dépôt distinct situé ici .

La fonction opendocx () fait partie de l'API héritée. La documentation concerne la nouvelle version. La version précédente n'a aucune documentation à proprement parler.

Ni la lecture ni l'écriture d'hyperliens ne sont pris en charge dans la version actuelle. Cette capacité est sur la feuille de route et le projet est en cours de développement. Cela s'avère être une API assez large, car Word a beaucoup de fonctionnalités. Nous y arriverons donc, mais probablement pas dans les prochains mois, à moins que quelqu'un décide de se concentrer sur cet aspect et de le contribuer.

4
scanny

vous pouvez essayer cela aussi

from docx import Document

document = Document('demo.docx')
for para in document.paragraphs:
    print(para.text)
3
user3732708

Alors que d'autres réponses montrent comment nous pouvons utiliser python-docx, voici comment vous pouvez lire un fichier .docx avec la fonction inbuild open de python:

data = open(file, 'r', encoding="ISO-8859-1").read()

Vous devez spécifier encoding = "ISO-8859-1" dans les arguments. J'espère que ça aide.

0
Rishabh Agrahari

En utilisant python-docx, comme le montre la réponse de @Chinmoy Panda: 

for para in doc.paragraphs:
    fullText.append(para.text)

Cependant, para.text perdra le texte dans w:smarttag (le problème github correspondant est ici: https://github.com/python-openxml/python-docx/issues/328 ), vous devez utiliser la fonction suivante à la place:

def para2text(p):
    rs = p._element.xpath('.//w:t')
    return u" ".join([r.text for r in rs])
0
Xing Shi

J'avais un problème similaire alors j'ai trouvé une solution de contournement (supprimez les balises de lien hypertexte grâce aux expressions régulières afin qu'il ne reste plus qu'une balise de paragraphe). J'ai posté cette solution sur https://github.com/python-openxml/python-docx/issues/85 BP

0
user4264327