我正在使用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程序中关闭一个文件时,它就会从列表中打开下一个文件,直到列表用完为止。
答案 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}')
我敢肯定有一种解决问题的更优雅的方法,但是它可以很好地满足我的需求。