84 votes

Comment puis-je lire un fichier .docx de Word 2007 ?

J'aimerais rechercher dans un fichier Word 2007 (.docx) une chaîne de texte, par exemple "une phrase spéciale" qui pourrait être trouvée par une recherche dans Word.

Existe-t-il un moyen de voir le texte à partir de Python ? Je ne suis pas intéressé par le formatage - je veux juste classer les documents comme ayant ou n'ayant pas "une phrase spéciale".

433voto

mikemaccana Points 7470

Après avoir lu votre message ci-dessus, j'ai créé un module docx 100% natif Python pour résoudre ce problème spécifique.

# Import the module
from docx import *

# Open the .docx file
document = opendocx('A document.docx')

# Search returns true if found    
search(document,'your search string')

Le module docx est à https://python-docx.readthedocs.org/en/latest/

62 votes

Attendez... Vous avez écrit un module entier juste pour cette question ? !

54 votes

@11684 Oui, j'ai eu le même problème que l'affiche, et tout ce que j'ai pu trouver, ce sont des solutions horribles pour invoquer .net ou Java depuis Python.

9 votes

Si je savais comment te donner mes points de réputation, je te les attribuerais pour cette réponse "écrire une solution" ! Alors je l'ai tweeté à la place. GRANDS MERCIS ! (temps total pour résoudre ce problème : 25mins, grâce à quelqu'un qui a écrit le code pour moi)

42voto

PhiLho Points 23458

Plus exactement, un document .docx est une archive Zip au format OpenXML : vous devez d'abord la décompresser.
J'ai téléchargé un échantillon (Google : un certain terme de recherche filetype:docx ) et après avoir décompressé, j'ai trouvé quelques dossiers. Le mot Le dossier contient le document lui-même, dans le fichier document.xml .

2 votes

J'ai obtenu tous les fichiers xml, mais je voudrais vous demander comment on peut obtenir toutes les valeurs comme (gras, italique, couleur, nom de famille, espace) et tous les paramètres de formatage.

21voto

Tony Meyer Points 4700

Dans cet exemple, "Course Outline.docx" est un document Word 2007, qui contient le mot "Windows", et ne contient pas la phrase "random other string".

>>> import zipfile
>>> z = zipfile.ZipFile("Course Outline.docx")
>>> "Windows" in z.read("word/document.xml")
True
>>> "random other string" in z.read("word/document.xml")
False
>>> z.close()

En gros, il suffit d'ouvrir le fichier docx (qui est une archive zip) en utilisant fichier zip et trouver le contenu dans le fichier "document.xml" du dossier "word". Si vous voulez être plus sophistiqué, vous pouvez alors analyser le XML Mais si vous recherchez simplement une phrase (dont vous savez qu'elle ne sera pas une balise), vous pouvez simplement rechercher la chaîne dans le XML.

5 votes

Il est probablement plus facile de rechercher la phrase dans le texte de l'élément (à l'aide d'un analyseur XML) que de se demander si une partie de votre texte correspond à un nom d'élément.

20voto

romeok Points 304

Le problème de la recherche à l'intérieur d'un fichier XML de document Word est que le texte peut être divisé en éléments à n'importe quel caractère. Il sera certainement divisé si le formatage est différent, par exemple comme dans Bonjour Monde . Mais il peut peuvent être divisés à n'importe quel moment et cela est valable dans OOXML. Vous finirez donc par avoir affaire à un XML comme celui-ci, même si le formatage ne change pas au milieu de la phrase !

<w:p w:rsidR="00C07F31" w:rsidRDefault="003F6D7A">

<w:r w:rsidRPr="003F6D7A">

<w:rPr>

<w:b /> 

</w:rPr>

<w:t>Hello</w:t> 

</w:r>

<w:r>

<w:t xml:space="preserve">World.</w:t> 

</w:r>

</w:p>

Vous pouvez bien sûr le charger dans un arbre DOM XML (je ne suis pas sûr de ce que ce sera en Python) et demander à obtenir le texte uniquement sous forme de chaîne, mais vous pourriez vous retrouver avec de nombreuses autres "impasses", simplement parce que la spécification OOXML fait environ 6000 pages et que MS Word peut écrire beaucoup de "choses" auxquelles vous ne vous attendez pas. Vous pourriez donc finir par écrire votre propre bibliothèque de traitement de documents.

Ou vous pouvez essayer d'utiliser Aspose.Words .

Il est disponible sous forme de produits .NET et Java. Les deux peuvent être utilisés à partir de Python. L'un via COM Interop, l'autre via JPype. Voir Aspose.Words Programmers Guide, Utilize Aspose.Words in Other Programming Languages (désolé, je ne peux pas poster un second lien, stackoverflow ne me le permet pas encore).

2 votes

OOXML spec is around 6000 pages long : Vous vous moquez de moi :O

4voto

kokos Points 10083

Un docx est juste une archive zip avec beaucoup de fichiers à l'intérieur. Peut-être pouvez-vous regarder le contenu de ces fichiers ? Sinon, vous devrez probablement trouver une bibliothèque qui comprend le format word afin de pouvoir filtrer les éléments qui ne vous intéressent pas.

Un deuxième choix serait d'interopérer avec word et d'effectuer la recherche par ce biais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X