簡體   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