在while循环中使用生成器并在每次生成后进行评估

时间:2019-03-07 12:53:46

标签: python while-loop iteration generator

我正在使用Python在CAD程序中打开某些文件。由于当我一次打开太多文件时该程序将崩溃,因此我希望脚本停止从文件大小总和超过一定值时生成的列表中打开文件。

这是我到目前为止所拥有的:

我正在将日志文件转换为列表。它包含用逗号分隔的文件路径:

fList = []

with open('C:/Users/user/Desktop/log.txt', 'r') as f:
    fList = f.read().split(',')
    with suppress(ValueError, AttributeError):
        fList.remove('')
    fcount = len(fList)

这是我用来遍历partList的生成器:

def partGenerator(partList):
    for file in partList:
        yield file

在这里,我尝试遍历文件,而它们的总和小于2500000 bit:

count = 0
progression = 0
storage = 0

while storage < 2500000:
    for file in partGenerator(fList):
        name = os.path.basename(file)
        storage += os.path.getsize(file)
        print(f'Auslastung: {storage} bite / 2500000 bite')
        oDoc = oApp.Documents.Open(file)

        progression += 1
        percent = round(100 * progression / fcount)
        print(f'Fortschritt: {progression} / {fcount} ({percent} %) - {name}')

发生的情况是,文件在CAD软件中正确打开,但是在超过while条件后它们不会停止。我的猜测是,while条件是在列表中的条目用完之后而不是像我这样输入每个条目之后才进行评估的。

有关正确语法的帮助会很棒!

我最终要寻找的东西:

我希望使用此脚本来打开一些文件,并且每当我手动在CAD程序中关闭一个文件时,它就会从列表中打开下一个文件,直到列表用完为止。

2 个答案:

答案 0 :(得分:2)

从不检查您的while条件,不,因为for循环从不让Python检查。 for循环从生成器函数中获取元素并不存在。

如果您的情况仍然成立,则需要检查{strong 内部):

for

for file in partGenerator(fList): name = os.path.basename(file) storage += os.path.getsize(file) if storage >= 2500000: # wait for input before continuing, then reset the storage amount input("Please close some files to continue, then press ENTER") storage = 0 语句下的块中的完整套件(一系列语句)完成运行或执行while语句之前,Python不会检查while ...:条件。 {1}}条件真的不适合这里。

在上面的示例中,我使用了技术含量较低的continue函数来询问运行脚本的任何人,之后再按while。这取决于input()实际提供的API,以查看是否可以使用它来检测文件是否已关闭。

如果要使用生成器功能,请使其跟踪文件大小。您甚至可以让它从CSV文件中读取这些内容。顺便说一下,我将使用csv module处理拆分和进度:

ENTER

然后只需使用

oDoc.Documents

请注意,打开文件的绝对数量是操作系统限制的大小,而不是文件的大小。

答案 1 :(得分:0)

在Martijn Pieters的帮助下,我想到了最适合我的东西。我是编程的菜鸟,所以花了我一段时间才能理解问题。这到底是怎么回事:

fList = []

with open('C:/Users/jhoefler/Desktop/log.txt', 'r') as f:
    fList = f.read().split(',')
    with suppress(ValueError, AttributeError):
        fList.remove('')
    fcount = len(fList)

count = 0
progression = 0

for file in fList:

    name = os.path.basename(file)
    if oApp.Documents.Count < 10:
        oDoc = oApp.Documents.Open(file)
    else:
        pCount = oApp.Documents.LoadedCount
        fCount = oApp.Documents.LoadedCount
        while fCount == pCount:
            time.sleep(1)
            pCount = oApp.Documents.LoadedCount
        oDoc = oApp.Documents.Open(file)

    progression += 1
    percent = round(100 * progression / fcount)
    print(f'Fortschritt: {progression} / {fcount} ({percent} %) - {name}')

我敢肯定有一种解决问题的更优雅的方法,但是它可以很好地满足我的需求。