繁体   English   中英

dbf文件中没有eof循环时如何做?

[英]How to make do while not eof loop in dbf files?

我有一个 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)

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

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

这也有点令人困惑,因为你有

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 循环中通常是不好的做法。 PEP 20 (The Zen of Python) 指出扁平比嵌套更好。

使用break打破循环例如:

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

这给出了 output:

1
2
3
...
98
99

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM