Lisez l'ancien fichier Word du formulaire d'application Gakushin DC (.doc) à partir de Python et essayez de le faire fonctionner

motivation

J'ai entendu d'un employé d'université qu'il était difficile de vérifier le Formulaire de demande de Kakenhi. .. Actuellement, il semble mettre du rouge un par un à la main.

Ce serait bien d'avoir un outil de vérification automatique. J'espère pouvoir créer un outil de vérification automatique avec Python! Tout en réfléchissant, c'est une lourde charge à faire immédiatement, alors j'ai d'abord essayé de lire et d'écrire des fichiers Word à partir de Python. Comme exemple selon le formulaire de candidature Kakenhi, l'auteur a soumis en juin 2011 Science Promotion Association Research Fellow (Gakushin) DC2 J'ai lu le formulaire de candidature. Si vous n'êtes pas familier avec Gakushin, vous pouvez obtenir une réponse émotionnelle lorsque vous demandez à un doctorant familier.

Comment lire un fichier Word à partir de Python?

Read from a word file in python

Il existe principalement python-docx et docx2txt, tous deux .docx. Seuls les fichiers sont pris en charge. Comme nous le verrons plus tard, lors de la lecture d'un fichier .doc, vous devrez le convertir en .docx avec antiword. Étant donné que docx2txt peut lire le texte des en-têtes, pieds de page et hyperliens, je l'ai principalement essayé avec docx2txt cette fois.

environnement

Installez python-docx

bash


pip install python-docx

Il semble que python-docx ne supporte que jusqu'à Python 3.4, mais cela fonctionne avec Python 3.7. Anaconda n'a pas Python 3.4, donc je l'ai laissé à 3.7.

Installez docx2txt

bash


pip install docx2txt

installation d'anti-mot

Comme je l'expliquerai plus tard, le fichier Word que je voulais lire comme exemple était au format .doc au lieu de .docx. Impossible d'ouvrir les fichiers au format .doc avec python-docx. J'ai l'impression d'avoir perdu en l'ouvrant dans Word et en l'enregistrant au format .docx, alors j'ai essayé de le convertir avec antiword.

Installer avec apt-get: échec

En conclusion, je n'ai pas pu installer antiword avec apt-get sur Mac. Je pensais que l'anti-mot devrait être apt-get et fink / yu-sa / items / 351969b281f3aea5e03d) est inséré, et il est dit qu'il n'y a pas de JDK lors de l'installation de fink. J'ai été ignoré sur la page de téléchargement (bien sûr, l'installation de Flashplayer n'a pas aidé).

bash


sudo apt-get antiword

Résultat de sortie


E: Invalid operation antiword

Installer avec infusion: succès

bash


brew install antiword

J'ai regardé ici et entré la commande de brassage, et elle a été installée avec succès.

bash


(base) akpro:~ kageazusa$ antiword
	Name: antiword
	Purpose: Display MS-Word files
	Author: (C) 1998-2005 Adri van Os
	Version: 0.37  (21 Oct 2005)
	Status: GNU General Public License
	Usage: antiword [switches] wordfile1 [wordfile2 ...]
	Switches: [-f|-t|-a papersize|-p papersize|-x dtd][-m mapping][-w #][-i #][-Ls]
		-f formatted text output
		-t text output (default)
		-a <paper size name> Adobe PDF output
		-p <paper size name> PostScript output
		   paper size like: a4, letter or legal
		-x <dtd> XML output
		   like: db (DocBook)
		-m <mapping> character mapping file
		-w <width> in characters of text output
		-i <level> image level (PostScript only)
		-L use landscape mode (PostScript only)
		-r Show removed text
		-s Show hidden (by Word) text

C'est un outil 2005!

Test de lecture / écriture avec python-docx

Après avoir copié le code dans la seconde moitié de ici, cela a fonctionné et j'ai pu créer et lire un fichier Word. Il ne semble y avoir aucun problème avec Python 3.7. De plus, lorsque j'ai copié et déplacé le code dans la section commentaire de here, dox_simple_service ne pouvait pas être lu. Je suppose que c'est probablement dû à la version Python.

error


ModuleNotFoundError: No module named 'docx_simple_service'

Convertir le fichier .doc en fichier .docx avec anti-mot et lire avec doc2txt

Je vais enfin lire l'exemple.

échantillon

Utilisez une application comme celle-ci. C'était une époque où les frontières qui ont récemment disparu étaient actives. Puisqu'il s'agit d'un fichier .doc, il ne peut pas être lu par Python tel quel. Je n'ai pas trouvé la version finale du fichier Word, je vais donc utiliser une version légèrement antérieure à la version finale à laquelle j'ai soumis un e-mail et fait vérifier le bureau. スクリーンショット 2020-10-26 23.22.11.png

Lire le fichier .doc

Je pourrais le lire immédiatement avec la fonction dans la réponse ici. Seule la partie spécifiée du chemin a été légèrement modifiée. J'ai converti le fichier .doc en un fichier .docx avec antiword et l'ai lu, et j'ai immédiatement supprimé le fichier .docx lu.

python


import os, docx2txt

def get_doc_text(filepath, file):
    
    if file.endswith('.docx'):
       text = docx2txt.process(file)
       return text
    
    elif file.endswith('.doc'):
       # converting .doc to .docx
       doc_file = os.path.join(filepath, file)
       docx_name = file + 'x'
       docx_file = os.path.join(filepath, docx_name)
        
       if not os.path.exists(docx_file):
          os.system('antiword ' + doc_file + ' > ' + docx_file)
            
          with open(docx_file) as f:
             text = f.read()
          os.remove(docx_file) #docx_file was just to read, so deleting
        
       else:
          # already a file with same name as doc exists having docx extension, 
          # which means it is a different file, so we cant read it
          print('Info : file with same name of doc exists having docx extension, so we cant read it')
          text = ''
        
       return text

J'ai pu le lire! スクリーンショット 2020-10-27 22.45.58.png

Essayez d'extraire le contenu de chaque sous-titre

Je voudrais extraire le contenu de chaque sous-titre en utilisant le texte que j'ai lu. Dans cet exemple, les sous-titres sont placés entre []. [Problème]

Formatage du texte

Supprimer les sauts de ligne, etc.

python


gakushin = get_doc_text('./sample', '110624GakushinDraftKAGE2.1.doc')
gakushin = gakushin.replace('\n', '').replace('|', '').replace('\u3000', '')

スクリーンショット 2020-10-28 19.57.37.png Il reste encore un espace continu, alors supprimez-le en regardant ici.

python


import re

#Supprimer l'espace continu pour créer un espace demi-largeur
gakushin = re.sub('[  ]+', ' ', gakushin)

Il y a des endroits où je veux que l'espace reste, comme entre et al. Et l'année, alors j'ai laissé un espace demi-largeur pour le moment. À proprement parler, il est préférable de supprimer tous les espaces et de ne les remplacer qu'autour et al. スクリーンショット 2020-10-28 20.06.55.png

Extraction de sous-titres

Essayez de rechercher la pièce entre []. Je suis une personne faible avec des expressions régulières, alors j'ai cherché et référencé ici et cela a fonctionné.

python


re.findall('\【.+?\】', gakushin)

Résultat de sortie


['【Contexte】',
 '【problème】',
 '[Solutions, objectifs de recherche, méthodes de recherche, caractéristiques et points originaux]',
 '[Progrès de la recherche 1]',
 '[Progrès de la recherche 2]',
 '[Contexte des futurs plans de recherche]',
 '[Problèmes / Points à résoudre]',
 '[Comment avez-vous eu l'idée]',
 '【2-1】',
 '【2-2】',
 '[Référé]',
 '[Pas de présentation / inspection orale]',
 '[Présentation d'affiches / pas d'inspection]',
 '[Motivation pour aspirer à un poste de recherche]',
 '[Visant l'image du chercheur]',
 '[Avantages personnels, etc.]',
 '[Particulièrement excellents résultats et récompenses universitaires]',
 '[Activités hors campus caractéristiques]']

Les sous-titres ont été extraits!

Extraction de phrases sous des sous-titres

Stockons les sous-titres dans une variable et utilisons les sous-titres eux-mêmes pour diviser le texte `` gakushin ''.

python


subhead = re.findall('\【.+?\】', gakushin)
text = gakushin
split_result = []

for i in range(len(subhead)):
    new_text = text.split(subhead[i])
    split_result.append(new_text[0])
    text = new_text[1]
    
#Seul le dernier[1]Mettre en
split_result.append(new_text[1])

スクリーンショット 2020-10-28 22.15.43.png J'ai pu diviser le texte en sous-titres et les énumérer. Vérifions le nombre d'éléments.

python


print('Nombre d'éléments de sous-titre', len(subhead))
print('Nombre d'éléments dans la phrase divisée', len(split_result))

Résultat de sortie


Nombre d'éléments de sous-titre 18
Nombre d'éléments dans la phrase divisée 19

Le nombre d'éléments du sous-titre + 1 = le nombre d'éléments de la phrase divisé par le sous-titre, et le calcul semble correct. Essayez de le stocker dans le pandas DataFrame afin que le sous-titre et le texte en dessous correspondent. Le premier élément de la liste split_result sera rejeté.

python


import pandas as pd

df = pd.DataFrame([subhead, split_result[1:19]]).T
df.columns = ['subhead', 'text']

スクリーンショット 2020-10-28 22.22.46.png

Les sous-titres et le texte en dessous ont été associés. Comptons le nombre de caractères et mettons-le dans le bloc de données.

python


df['length'] = df.text.apply(len)

スクリーンショット 2020-10-28 22.38.25.png L'item [2-2] semble particulièrement long. Même si vous regardez cela seul, ce que représente [2-2] n'est pas clair. Cela ressemble à un plan de recherche, mais la raison pour laquelle il n'y a pas de [1] est inconnue.

Sommaire

J'ai pu lire le fichier .doc depuis Python et manipuler le texte. J'aimerais essayer diverses choses à l'avenir.

référence

Recommended Posts

Lisez l'ancien fichier Word du formulaire d'application Gakushin DC (.doc) à partir de Python et essayez de le faire fonctionner
Python --Lisez des données à partir d'un fichier de données numériques pour trouver des matrices, des valeurs propres et des vecteurs propres distribués co-distribués
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Python --Lisez les données d'un fichier de données numériques et recherchez la ligne de régression multiple.
Conversion de Fourier du fichier wav lu par Python, conversion inverse et réécriture
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Modèle de script python pour lire le contenu du fichier
[Python] Essayez de lire la bonne réponse au problème FizzBuzz
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Lisez le fichier csv et affichez-le dans le navigateur
Lisez le fichier xml en vous référant au didacticiel Python
Lire le fichier json avec Python, le formater et générer le json
Essayez de le faire avec GUI, PyQt en Python
Comment changer le fichier de configuration pour qu'il soit lu par Python
Essayez d'exploiter un fichier Excel en utilisant Python (Pandas / XlsxWriter) ①
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Essayez d'exploiter un fichier Excel en utilisant Python (Pandas / XlsxWriter) ②
[Python] J'ai installé le jeu depuis pip et j'ai essayé de jouer
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3
Lisez le binaire big endian en Python et convertissez-le en ndarray
Lisez le fichier en Python avec un chemin relatif depuis le programme
Convertissez le résultat de python optparse en dict et utilisez-le
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
Utilisez Firefox avec Selenium depuis python et enregistrez la capture d'écran
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Python - Obtenez le taux de bitcoin BTC / JPY à partir de bitflyer à intervalles réguliers et enregistrez-le dans un fichier
Essayez d'exploiter Facebook avec Python
Passez les éléments sélectionnés dans Tablacus Explorer de JScript à python et renommez-les tous à la fois
Lire et utiliser des fichiers Python à partir de Python
Lisez les données du lecteur NFC connecté à Raspberry Pi 3 avec Python et envoyez-les à openFrameworks avec OSC
Supprimer ou récupérer des tableaux de fasta en fonction du fichier de liste d'ID
[Python Kivy] Comment obtenir le chemin du fichier par glisser-déposer
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Essayez d'utiliser le framework web de Python Django (1) - De l'installation au démarrage du serveur
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Lisez le fichier avec python et supprimez les sauts de ligne [Notes sur la lecture du fichier]
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.
De Python à l'utilisation de MeCab (et CaboCha)
Lisons le fichier RINEX avec Python ①
Lisez le fichier ligne par ligne avec Python
Portage et modification du solveur de doublets de python2 vers python3.
Essayez d'utiliser Excel en utilisant Python (Xlwings)
Comment faire fonctionner Linux depuis la console
Lire Python csv et exporter vers txt
Python amateur tente de résumer la liste ①
[python] Lisez le fichier html et entraînez-vous au scraping
[Python] Lire la ligne spécifiée dans le fichier
Différentes façons de lire la dernière ligne d'un fichier csv en Python
Essayez de porter le programme «Programmation informatique numérique FORTRAN77» vers C et Python (partie 1)
[Introduction à Pandas] Lire un fichier csv sans nom de colonne et lui donner un nom de colonne
Organisez le flux depuis l'octroi d'autorisations aux utilisateurs python pour effectuer des migrations et migrer
[Python] Combiner des listes contenant des nombres en chaînes et les écrire dans un fichier de sortie
Essayez de porter le programme "FORTRAN77 Numerical Computing Programming" vers C et Python (partie 3)
Essayez de porter le programme "FORTRAN77 Numerical Computing Programming" vers C et Python (partie 2)
Comment lire les fichiers de numéros de série en boucle, les traiter et les représenter graphiquement