| name | docx-read |
| description | DOCX: Read text, tables, and metadata from a Word document. |
| metadata | {"version":"0.22.0","openclaw":{"category":"productivity","requires":{"bins":["python"]}},"maxent":{"requires":{"bins":[{"name":"python","install":{"windows":{"method":"winget","id":"Python.Python.3"},"linux":{"method":"apt","id":"python3"},"darwin":{"method":"brew","id":"python"}}}]}}} |
docx-read
PREREQUISITE: Ensure python-docx is installed: pip install python-docx
Read text, tables, and metadata from a .docx Word document.
Usage
python - <<'EOF'
from docx import Document
doc = Document("path/to/file.docx")
for para in doc.paragraphs:
print(para.text)
EOF
Recipes
Read all paragraphs
python - <<'EOF'
from docx import Document
doc = Document("report.docx")
for para in doc.paragraphs:
if para.text.strip():
print(para.text)
EOF
Read paragraphs with style labels
python - <<'EOF'
from docx import Document
doc = Document("report.docx")
for para in doc.paragraphs:
if para.text.strip():
print(f"[{para.style.name}] {para.text}")
EOF
Read all tables
python - <<'EOF'
from docx import Document
doc = Document("report.docx")
for i, table in enumerate(doc.tables):
print(f"--- Table {i+1} ---")
for row in table.rows:
print([cell.text for cell in row.cells])
EOF
Read tables as CSV
python - <<'EOF'
import csv, sys
from docx import Document
doc = Document("report.docx")
writer = csv.writer(sys.stdout)
for i, table in enumerate(doc.tables):
print(f"# Table {i+1}")
for row in table.rows:
writer.writerow([cell.text.strip() for cell in row.cells])
EOF
Read core metadata
python - <<'EOF'
from docx import Document
doc = Document("report.docx")
cp = doc.core_properties
print("Title: ", cp.title)
print("Author: ", cp.author)
print("Created:", cp.created)
print("Modified:", cp.modified)
print("Subject:", cp.subject)
EOF
Full document dump (paragraphs + tables)
python - <<'EOF'
from docx import Document
doc = Document("report.docx")
print("=== PARAGRAPHS ===")
for para in doc.paragraphs:
if para.text.strip():
print(f"[{para.style.name}] {para.text}")
print("\n=== TABLES ===")
for i, table in enumerate(doc.tables):
print(f"--- Table {i+1} ---")
for row in table.rows:
print([cell.text.strip() for cell in row.cells])
EOF
Tips
- Read-only — never modifies the file.
doc.paragraphs includes headings; check para.style.name to distinguish (e.g. "Heading 1", "Normal").
- Tables nested inside other tables are not returned by
doc.tables — iterate cell.tables if needed.
- Use
para.runs to access individual text runs with font/bold/italic details.
See Also