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
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