【问题标题】:Python loop problemsPython循环问题
【发布时间】:2025-12-28 08:45:06
【问题描述】:

我有一个脚本可以计算文件夹中文件的数量,如果它小于最大数量,它会创建新文件,直到有正确的数量。理想情况下,当旧文件被删除时,应该生成新文件。问题是,如果一次只删除一个文件,我的代码有时不会创建新文件。有时会,有时不会。如果一次删除多个文件,它将始终创建新文件。

import os

cfcount = 0
maxcalls = 7
run = 1
filecount = 0

def callFile(channel, maxretries, retrytime, waittime, context, ext):
    #create sting
    return callfile

def getCount():
    """Gets the number of callfiles in the directory"""
    count = 0
    files = os.listdir("c:\\proc")
    for file in files:
            if os.path.isfile("c:\\proc\\" + file):
                count += 1
                #print (count)
    return count

run = 1
while run == 1:
    """main loop that runs until there's no more people left to call"""
        filecount = getCount()    
        print (filecount)
        lacking_filecount = maxcalls - filecount
    while lacking_filecount > 0:
        cfcount += 1
        f = open("c:\proc\callfile" + str(cfcount) + ".call", 'w')
        f.write(callFile("SIP/200", '0', '0', '45', "call-file-test", '200'))
        f.close()
        print ("Filecount: " + str(filecount))
        print ("Callfile number: " + str(cfcount))
        lacking_filecount -= 1

如果我保留 print(filecount) 语句,我每次都能让它正常工作。如果我删除该语句,它有时有效,有时无效。

这是输出

>>> 
0
Filecount: 0
Callfile number: 1
Filecount: 0
Callfile number: 2
Filecount: 0
Callfile number: 3
Filecount: 0
Callfile number: 4
Filecount: 0
Callfile number: 5
Filecount: 0
Callfile number: 6
Filecount: 0
Callfile number: 7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7

没有 print(filecount) 它看起来像这样。它一直工作到大约 9 号,然后如果只删除一个文件,它就会停止替换新文件。请注意,它仍然会打印一个 callfile 编号。

>>> 
Callfile number: 1
Callfile number: 2
Callfile number: 3
Callfile number: 4
Callfile number: 5
Callfile number: 6
Callfile number: 7
Callfile number: 8
Callfile number: 9
Callfile number: 10
Callfile number: 11
Callfile number: 12

这是 getCount() 循环内 print(file) 的输出。它还没有与添加的打印语句一起工作。

Callfile number: 17
callfile1.call
callfile17.call
callfile2.call
callfile3.call
callfile4.call
callfile5.call
callfile6.call
callfile1.call
callfile17.call

【问题讨论】:

  • 不需要while run == 1,Python 有 bool,这不是 C :)
  • 经过进一步检查,我想我误解了这个问题。似乎循环的内容比您发布的要多——它在哪里终止?如果它在无限循环中运行,那么如果在下一次迭代中才检测到已删除的文件,为什么没有检测到它是一个问题?除非您说getCount() 在删除单个文件时(有时)始终返回错误的输出(在这种情况下,您使用的平台可能是相关的)?
  • 我不知道为什么,但它确实会在下一个循环中被检测到,它会触发 cfcount 但它不会创建文件,如果只有一个被删除并且只是有时。其他时候它工作得很好。我试过从空文件夹和完整文件夹开始,对我来说似乎是随机的。我对 linux 很陌生,但我觉得我应该寻找一种方法来挂钩在删除文件时触发的事件。
  • 将该部分(文件系统事件)作为单独的问题发布。 os.listdir() 的输出是否始终如您所愿?
  • 好吧,我很难过,对不起。当你弄清楚时发布答案,我很好奇!

标签: python function loops


【解决方案1】:

似乎正在创建的文件和出现在os.listdir() 输出中的文件之间存在竞争条件。大多数情况下,打印语句可能需要刚刚足够的时间在您的系统上“修复”这个问题。

为什么不改变你的逻辑,让它只调用一次getCount(),然后创建适当数量的文件?

filecount = getCount()
lacking_filecount = maxcalls - filecount
while lacking_filecount > 0:
    # Create file...
    lacking_filecount -= 1

此外,您似乎有一个无限循环,因为您从未在循环内设置run

【讨论】:

  • 非常感谢。我越来越沮丧。这就是我应该首先做的。无限循环只是因为我还没有计算出运行多少次。
  • @rhys:太好了,事后我不确定问题出在哪里:-) 请注意,如果你想要一个循环运行到某个终止条件(无论出于何种原因)你不想要放入循环语句的条件部分,通常的方法是使用while True:,然后在循环中的某处使用break statement。比使用控制变量更简洁明了
  • 我更新了代码,它实际上做了同样的事情。它仍然更快。我要看看你从那以后说的话。
  • 可能是因为它在 Windows 上?最终我在 linux 上运行它,但我认为这并不重要。
  • @rhys:当单个文件被删除时,您是否仍然在os.listdir() 的输出中看到它(有时)? (我仍在努力解决问题)