繁体   English   中英

Python结合For循环

[英]Python Combine For-Loops

我正在使用python-docx来操作word文档。 以下是我目前在正常段落中修改文本的内容:

doc = Document('idk.docx')
for paragraph in doc.paragraphs:
    if "oldtext1" in paragraph.text:
        paragraph.replace("oldtext1","Something")
    if "oldtext2" in paragraph.text:
        paragraph.replace("oldtext2","Somethingelse")

如果我想修改表格中的文本,我需要执行以下操作

tables = doc.tables
for table in tables:
    for row in table.rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                if "oldtext1" in paragraph.text:
                    paragraph.replace("oldtext1","Something")
                if "oldtext2" in paragraph.text:
                    paragraph.replace("oldtext2","Somethingelse")

代码工作正常,文本被替换,但问题是我试图替换文档中的文本的所有实例,我不想有2个单独的循环(1代表段落中的普通文本,另一代代表表格中的文本) )

是否有一种简单的方法来组合这些循环,所以我不必在2个不同的循环中使用相同的if语句?

我只想使用生成器理解:

from itertools import chain

for paragraph in chain(doc.paragraphs, (paragraph for table in doc.tables for row in table.rows for cell in row.cells for paragraph in cell.paragraphs)):
    paragraph.replace("oldtext1","Something")
    paragraph.replace("oldtext2","Somethingelse")

请注意,您不需要对paragraph.replace()超前检查

虽然生成器理解工作正常,但将此任务委托给它自己的函数可能更清晰。 它的可读性更高。

# Python 2.X
def get_all_paragraphs(document):
    for paragraph in document.paragraphs:
        yield paragraph

    for table in document.tables:
        for row in table.rows:
            for cell in row.cells:
                for paragraph in cell.paragraphs:
                    yield paragraph

这可以通过使用构造中的yield from在Python 3.X中清除一些。

# Python 3.X
def get_all_paragraphs(document):
    yield from document.paragraphs

    for table in document.tables:
        for row in table.rows:
            for cell in row.cells:
                yield from cell.paragraphs

我想不出办法绕过“行中的行......行中的单元格......”模式。

用法是:

for paragraph in get_all_paragraphs(doc):
    paragraph.replace("oldtext1","Something")
    paragraph.replace("oldtext2","Somethingelse")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM