El objetivo de este tutorial es crear documentos en formato .docx y para ello vamos a usar la biblioteca python-docx
, puesto que es la más adecuada en el mundo Python para cumplir con nuestro objetivo.
python-docx
nos permite escribir documentos desde una API de alto nivel sin tener que saber toda la estructura e interioridades que desmenuzamos de forma breve en el anterior capitulo.
Empecemos a escribir algo de código.
El objeto Document
El objeto Document
es nuestro punto de entrada a la creación o modificación de documentos con formato .docx
.
1 2 3 |
from docx import Document doc = Document() |
Si miramos todo lo que proporciona este objeto:
1 |
print(dir(doc)) |
El anterior comando nos mostrará:
1 2 3 4 5 6 7 8 9 10 11 |
['_Document__body', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_block_width', '_body', '_element', '_parent', '_part', 'add_heading', 'add_page_break', 'add_paragraph', 'add_picture', 'add_section', 'add_table', 'core_properties', 'element', 'inline_shapes', 'paragraphs', 'part', 'save', 'sections', 'settings', 'styles', 'tables'] |
Vemos que existen varios métodos que comienzan por add_*
como
add_heading
que nos permite añadir un cabecero.add_page_break
que nos permite añadir un salto de página.add_paragraph
que nos permite añadir un párrafo.add_picture
que nos permite añadir una imagen.add_section
que nos permite añadir una sección.add_table
que nos permite añadir una tabla.
Por otra parte tenemos core_properties
, que es una property que nos permite acceder al objeto CoreProperties
. Este objeto nos permite leer y escribir metadatos del documento que no son visibles.
1 2 3 4 5 6 |
coreprops = doc.core_properties props = dir(coreprops) for prop in props: if not prop.startswith("_"): print(f"propiedad {prop:20s}: {getattr(coreprops, prop)}") |
Lo anterior nos mostrará algo parecido a:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
propiedad author : python-docx propiedad category : propiedad comments : generated by python-docx propiedad content_status : propiedad created : 2013-12-23 23:15:00 propiedad identifier : propiedad keywords : propiedad language : propiedad last_modified_by : propiedad last_printed : None propiedad modified : 2013-12-23 23:15:00 propiedad revision : 1 propiedad subject : propiedad title : propiedad version : |
Por último, tenemos algunas cosas más como inline_shapes
, paragraphs
, sections
, settings
, styles
, tables
. Nos permiten acceder a partes y características del documento. Veamos como podemos acceder, por ejemplo, a los párrafos:
1 |
doc.paragraphs |
Lo anterior nos devuelve una lista, vacía de momento, que contiene los objetos Paragraph
que veremos más adelante.
Añadiendo párrafos
1 2 3 4 5 6 7 8 |
par1 = "Esto es el párrafo 1." par2 = "Esto es el párrafo 2." par3 = "Esto es el párrafo 3." parrafos = [par1, par2, par3] for parrafo in parrafos: doc.add_paragraph(parrafo) print(doc.paragraphs) |
Lo anterior añade tres párrafos al objeto doc
y mostrará algo parecido a lo siguiente en pantalla:
1 2 3 |
[<docx.text.paragraph.Paragraph object at 0x7fd37c5f9fd0>, <docx.text.paragraph.Paragraph object at 0x7fd37c5f9590>, <docx.text.paragraph.Paragraph object at 0x7fd37c5f9090>] |
Vemos que ahora el documento dispone de los tres párrafos que acabamos de añadir usando el método add_paragraph
.
Modificando metadatos
Vamos a modificar algunos de los metadatos del documento.
1 2 3 4 5 6 7 8 9 10 |
import datetime as dt coreprops.author = "Kiko Correoso" coreprops.comments = "Generado para el tutorial de python-docx" coreprops.revision = 2 coreprops.created = dt.datetime.utcnow() for prop in props: if not prop.startswith("_"): print(f"propiedad {prop:20s}: {getattr(coreprops, prop)}") |
El anterior código debería mostrar algo parecido a lo siguiente en pantalla:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
propiedad author : Kiko Correoso propiedad category : propiedad comments : Generado para el tutorial de python-docx propiedad content_status : propiedad created : 2020-06-09 05:59:57 propiedad identifier : propiedad keywords : propiedad language : propiedad last_modified_by : propiedad last_printed : None propiedad modified : 2013-12-23 23:15:00 propiedad revision : 2 propiedad subject : propiedad title : propiedad version : |
Guardando el documento
En la instancia doc
del objeto Document
también vimos, en el capítulo anterior, que existía un método save
que nos permite guardar el documento con nuestras últimas modificaciones.
Vamos a guardar el documento y a abrirlo con un procesador de texto para poder ver nuestros cambios. En el ejemplo uso Libreoffice abriéndolo desde Jupyter notebook o desde la consola IPython (también puedes abrirlo haciendo doble-click sobre el fichero new.docx que estamos creando).
1 |
doc.save("new.docx") |
1 |
!libreoffice new.docx # para abrir el documento con libreoffice desde Jupyter/IPython |
Deberíamos ver un documento como el de la imagen inferior y si accedemos a las “Properties” desde dentro de Libreoffice podemos ver algunos de los metadatos que hemos modificado.

Resumen
Para empezar a crear un nuevo documento o para modificar uno ya existente hemos de usar el objeto Document
. Este objeto dispone de funcionalidad que nos permite ir creando las diferentes partes del documento. En los próximos capítulos iremos viendo más detalles.