Etiquetas

555 74HC04 74HC14 74HC165 74LS04 acentos ADC10 Amstrad archivo arduino aristóteles armbian array ass at backup base64 bash Basho bc beethoven Biblia blog bucle c c++ c++11 c++17 C005 cadena Carmina Burana casting CD4017 CD4040 Cine clases Colores connect Consolación a Helvia Consolación a Marcia Consolación a Polibio constante corsair CPC Cristal 32Khz css cursor mouse cut daemon date dead keys Debian directorio disco duro DS32kHz electricidad Electrónica ensamblador entryList epicureismo Estadística estoicismo felicidad ffmpeg filePath filosofia Filosofía firefox flac for fstab funcion Gargantúa gastronomía gilgamesh Ginott gmp gpt grep gtts Hobbes hotkeys html imagemagick inline Javascript kde kernel modulos latex ldr lib-notify Linux Literatura ludoteca macro mapa de bits Matroska mega Microsoft Word Milan Kundera mkvextract mkvinfo mount mp3 mplayer MSP430 msp430F5529 MSP432 Multimedia Musica oop orange_pi pato PIR PL9823 Platón poesía POO en C++ pulseaudio puntero PWM pygame pyqt python QAction qApp QApplication QByteArray QDialog Qdir QFile QFileDialog QImage qlabel QList QListWidget QMessagebox QMouseEvent qpainter QPalette QPixmap QProcess QRegularExpression QRegularExpressionMatchIterator QString QStringList Qt qt5 QToolbar quijote QVector qwidget R Rabelais ratón relé Resonador cerámico samba San Agustín screen Séneca signal slot smart smartctl sox srt static const stdarg.h subtítulos Symbian tar teléfonos móviles temperatura temperatura cpu Temporizador tesseract Timer timestamp Trigonometría tts tutorial uid unicode user USI va_arg va_end va_list va_start velocidad ventilador Voltaire wallpaper xboxdrv xinput xrandr Z80 zip

sábado, octubre 29, 2022

Convertir un archivo de Microsoft Word a texto utilizando python

 0. Objetivo

Se busca leer un archivo de Word y convertirlo en texto, convirtiendo cada párrafo en una linea. En este caso, no interesa el formato, tan sólo extraer el texto.

La librería python-docx permite trabajar con archivos de Word en un script de python.

 

Actualización de python 2 a python 3.

El articulo se escribiendo en python 2. Con el cambio a python 3, el código genera un error:

doc.add_paragraph(lin[:-1].decode("utf-8"))
AttributeError: 'str' object has no attribute 'decode'

Pero el bloque try...except oculta el motivo del error. El error en Python 3 se debe a un cambio en la forma en que se manejan las cadenas de texto entre Python 2 y Python 3. En Python 2, las cadenas se manejan como secuencias de bytes, mientras que en Python 3 las cadenas son secuencias de caracteres Unicode. En Python 3 la llamada a decode("utf-8") es redundante y provoca un error. Para resolver este problema, simplemente puede eliminarse la llamada al método decode("utf-8"). Las instrucciones print generan un error porque en python 3, el texto a imprimir va entre paréntesis. Después de hacer los cambios, el script parece funcionar en julio de 2023 con Debian11 y Python 3.9.2

 

1. Algunas importaciones  

Importar las librerías python-docx y sys.
from docx import Document
import sys

 

2.Leer el archivo de Word y guardarlo en una lista

1. Se abre el archivo de word con el comando open, indicando que es un archivo binario.
2. Se ha importado la clase Document, así que se instancia como document.
3. De document se recorren los párrafos y se toma el texto para guardarlo en una lista de python.
def openDocx (filename):
global txtlst
f = open(filename, 'rb')
document = Document(f)
f.close()
#print "p",len(document.paragraphs)
for p in document.paragraphs:
#print p.text
txtlst.append(p.text)
return 0

 

3. Guardar la lista como texto plano

La lista de texto se guarda en un archivo de texto. Cada párrafo se ha convertido en una linea de texto separada por un salto de linea. Se explicita utf-8 por los acentos.
def saveTxt(filename):
global txtlst

f = open (filename,'w')
for x in txtlst:
f.write(x.encode("utf-8")+"\n")
f.close()
return 0


4. Ponerlo todo junto

El script que lee el archivo de Word, guarda el texto y muestra unos bonitos mensajes.
#! /usr/bin/python
# -*- coding: utf8 -*-

from docx import Document
import sys


def mensajeUso():
print "Uso:"
print "\ttxt2docx <file.docx> <file.txt>"


def openDocx (filename):
global txtlst
f = open(filename, 'rb')
document = Document(f)
f.close()
#print "p",len(document.paragraphs)
for p in document.paragraphs:
#print p.text
txtlst.append(p.text)
return 0
def saveTxt(filename):
global txtlst

f = open (filename,'w')
for x in txtlst:
f.write(x.encode("utf-8")+"\n")
f.close()
return 0

if __name__ == "__main__":

if (len (sys.argv) != 3):
mensajeUso()
sys.exit (1)

txtlst = []
result = openDocx(sys.argv[1])
if (result !=0):
sys.exit(result)
result = saveTxt(sys.argv[2])
print "Lines:",len(txtlst)


 

5. Referencias

https://tech-cookbook.com/2019/10/21/how-to-work-with-docx-in-python/

 https://python-docx.readthedocs.io/en/latest/ 

https://www.geeksforgeeks.org/python-working-with-docx-module/ 

Y por supuesto el magnífico articulo que escribí sobre el proceso contrario 

 

 

No hay comentarios: