1
resposta

Leitura de arquivos docx

Olá, estou tentando fazer leitura de um arquivo no formato word com o seguinte código.

with open(relatorio, 'r', encoding='utf-8') as relat:
  relatorio = relat.read()
  print(relatorio)

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte

Sei que há libs específicas para esse proposito, porém, nesse momento pretendo usar apenas as formas "nativas" do python para leitura de arquivos, se for possível.

1 resposta

Olá, Rogério. Tudo bem?

É possível sim ler um arquivo .docx utilizando bibliotecas padrão do Python, ou seja, formas "nativas" que dispensam a necessidade de instalar módulos externos.

O conteúdo dos arquivos .docx é armazenado no formato XML por debaixo dos panos. Levando isso em consideração, podemos usar módulos e ferramentas da biblioteca padrão do Python para manipular o texto do nosso arquivo .docx.

Uma forma de fazer isso é utilizando os módulos zipfile e xml.etree.ElementTree.

Se temos um arquivo chamado Documento.docx que contém o seguinte conteúdo:

Olá mundo!
Esse é um texto de exemplo.

O código para ler esse conteúdo desse documento pode ser visto a seguir:

import zipfile
import xml.etree.ElementTree as ET

# Abrimos o arquivo .docx e salvamos como um objeto Zipfile
doc_zip = zipfile.ZipFile("Documento.docx")

# Acessamos o conteúdo do documento no formato XML através da função .read()
doc_xml = doc_zip.read("word/document.xml")

# Criamos um parser para converter o XML sem formatação
parser = ET.XMLPullParser(['end'])
parser.feed(doc_xml)

# Percorremos o conteúdo do XML e printamos ele
for _, elem in parser.read_events():
    if elem.text is not None:
        print(elem.text)

Saída do código:

Olá mundo!
Esse é um texto de exemplo.

Caso queira entender melhor como funciona esses módulos, deixo a seguir o link para a documentação de cada um deles:

Apesar da solução acima funcionar, não é recomendado "reinventar a roda". Isso significa que caso já exista um módulo que faz o que desejamos, o ideal é se possível utilizar esse módulo, pois ele já foi testado e leva em consideração diversos cenários e é menos passível a erros.

Assim, para ler documentos .docx em Python, temos por exemplo, o módulopython-docx.

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!