如何在dbf文件中不执行eof循环的情况下执行?

2024-10-04 11:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python程序,它可以打开一个包含30000条记录的dbf文件,我想结束我的while循环,但出于某种原因,我的while循环保持打开状态

      with DBF('data.DBF',recfactory=None,load =True) as table:
                for row in table:
                    stono = (row[1][1])
                    payrollid = (row[15][1])
                    busdate = (row[2][1])
                    firstname =  (row[13][1])
                    lastname = (row[14][1])

                    rows = [[stono,payrollid,busdate]]
                    print(rows) 
                try:
                    while True:
                        boolHasBlank = False
                        lastSsn = ssn
                        firstSsn = ssn 
                        newPayrollId = payrollid.strip()
                        newStoNo = stono
                        Fname = firstname
                        Lname = lastname
                        while True and stono == newStoNo and payrollid == newPayrollId:
                            if ssn is not firstSsn:
                                boolHasBlank = True
                            else:
                                lastSsn = ssn

                except EOFError as e:
                    print (e)

Tags: trueastablefirstnamerowsssnrowprint
2条回答

如果嵌套while循环启动,它将永远不会结束,因为它的条件不会更改条件中使用的任何变量。如果将“while”改为“if”,您可能会得到期望的结果。然后,您可以将该条件用作while循环条件

此外,您当前的代码在while循环中的每个迭代中的newPayrollId都是相同的。我假设try-except应该在for循环的“for-row-in-table”中

这也有点让人困惑

firstSsn = ssn

但是在嵌套的while循环中

if ssn is not firstSsn:

这永远是错误的,所以

lastSsn = ssn

将是唯一运行的,但在firstSsn=ssn之前已经有lastSsn=ssn。在while条件下,您还有一个不必要的True。因此,我认为您的代码可以更改为:

ssn = "something defined earlier"

with DBF('data.DBF', recfactory=None, load=True) as table:

    for row in table:
        stono = (row[1][1])
        payrollid = (row[15][1])
        busdate = (row[2][1])
        firstname = (row[13][1])
        lastname = (row[14][1])

        rows = [[stono, payrollid, busdate]]
        print(rows)

        try:
            while stono == newStoNo and payrollid == newPayrollId:
                boolHasBlank = False
                lastSsn = firstSsn = ssn
                newPayrollId = payrollid.strip()
                newStoNo = stono
                Fname = firstname
                Lname = lastname

        except EOFError as e:
            print(e)

当然,我没有足够的信息来了解你的代码到底是做什么的。也许有一个线程进程改变了我们看不到的snn值。作为旁注,在其他while循环中嵌套while循环通常是不好的做法。PEP20(Python的禅宗)指出,扁平比嵌套好

使用break来中断循环 例:

x = 0
while True:
   print(x)
   x += 1
   if x == 100:
      break

这将提供以下输出:

1
2
3
...
98
99

相关问题 更多 >