[英]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.