Jest jakiś sposób na czytanie.plik docx zawiera automatyczne numerowanie za pomocą Pythona-docx
Problem statement: Wyodrębnij sekcje z .plik docx zawierający automatyczne numerowanie.
Próbowałem w Pythonie-docx wyodrębnić tekst z .plik docx, ale wyklucza automatyczne numerowanie.
from docx import Document
document = Document("wadali.docx")
def iter_items(paragraphs):
for paragraph in document.paragraphs:
if paragraph.style.name.startswith('Agt'):
yield paragraph
if paragraph.style.name.startswith('TOC'):
yield paragraph
if paragraph.style.name.startswith('Heading'):
yield paragraph
if paragraph.style.name.startswith('Title'):
yield paragraph
if paragraph.style.name.startswith('Heading'):
yield paragraph
if paragraph.style.name.startswith('Table Normal'):
yield paragraph
if paragraph.style.name.startswith('List'):
yield paragraph
for item in iter_items(document.paragraphs):
print item.text
2 answers
Wygląda na to, że obecnie python-docx v0.8 nie obsługuje w pełni numeracji. Musisz się włamać.
Najpierw, dla wersji demo, aby iterować akapity dokumentów, musisz napisać swój własny iterator. Oto coś funkcjonalnego:
import docx.document
import docx.oxml.table
import docx.oxml.text.paragraph
import docx.table
import docx.text.paragraph
def iter_paragraphs(parent, recursive=True):
"""
Yield each paragraph and table child within *parent*, in document order.
Each returned value is an instance of Paragraph. *parent*
would most commonly be a reference to a main Document object, but
also works for a _Cell object, which itself can contain paragraphs and tables.
"""
if isinstance(parent, docx.document.Document):
parent_elm = parent.element.body
elif isinstance(parent, docx.table._Cell):
parent_elm = parent._tc
else:
raise TypeError(repr(type(parent)))
for child in parent_elm.iterchildren():
if isinstance(child, docx.oxml.text.paragraph.CT_P):
yield docx.text.paragraph.Paragraph(child, parent)
elif isinstance(child, docx.oxml.table.CT_Tbl):
if recursive:
table = docx.table.Table(child, parent)
for row in table.rows:
for cell in row.cells:
for child_paragraph in iter_paragraphs(cell):
yield child_paragraph
Można go użyć, aby znaleźć wszystkie akapity dokumentu, w tym akapity w komórkach tabeli.
Na przykład:
import docx
document = docx.Document("sample.docx")
for paragraph in iter_paragraphs(document):
print(paragraph.text)
Aby uzyskać dostęp do właściwości numeracja, musisz przeszukać "protected" members paragraph._p.pPr.numPr
, który jest obiektem docx.oxml.numbering.CT_NumPr
:
for paragraph in iter_paragraphs(document):
num_pr = paragraph._p.pPr.numPr
if num_pr is not None:
print(num_pr) # type: docx.oxml.numbering.CT_NumPr
Zauważ, że ten obiekt jest wyodrębniany z pliku numbering.xml
(wewnątrz docx), jeśli istnieje.
Aby uzyskać do niego dostęp, musisz odczytać plik docx jak pakiet. Na przykład:
import docx.package
import docx.parts.document
import docx.parts.numbering
package = docx.package.Package.open("sample.docx")
main_document_part = package.main_document_part
assert isinstance(main_document_part, docx.parts.document.DocumentPart)
numbering_part = main_document_part.numbering_part
assert isinstance(numbering_part, docx.parts.numbering.NumberingPart)
ct_numbering = numbering_part._element
print(ct_numbering) # CT_Numbering
for num in ct_numbering.num_lst:
print(num) # CT_Num
print(num.abstractNumId) # CT_DecimalNumber
Mor informacje są dostępne w Office Open XMl dokumentacja.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 16:21:37
Istnieje pakiet docx2python, który robi to w dużo prostszy sposób: pypi.org/project/docx2python/
Następujący kod:
from docx2python import docx2python
document = docx2python("C:/input/MyDoc.docx")
print(document.body)
Tworzy listę, która zawiera zawartość, w tym listy punktorów, w przyjemny sposób parsujący.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-25 12:57:54