2016-01-27 80 views
2

我需要在仍處於迭代器循環內部的情況下推進從Excel和Excel電子表格中讀取的行的迭代。如何在迭代器電子表格行內部提前迭代

try: 
    for r in range(insheet.nrows): 
     cdat = insheet.cell(r, 0).value 
     if not cdat == xlrd.empty_cell.value: 
      if hasNumbers(cdat): 
       #Strip digits to get Client pneumonic 
       #pdb.set_trace() 
       if re.sub(r'\d','',cdat) == CLNTID: 
        #pdb.set_trace() 
        #This call belongs to this client 
        memId = cdat 
        fInCallBlock = True 
        while fInCallBlock: 
         #Output this line formatted as CallHeader 
         #Inc row counter 
    Can't do this ==> next(r) 
         cdat = cdat.strip(insheet.cell(r, 0).value) 
         if cdat == u"Call Resolved": 
          pdb.set_trace() 
          fInCallBlock = False 

代碼崩潰,其中註明:

-> next(r) 
(Pdb++) n 
TypeError: 'int object is not an iterator' 

,我只是不能找出如何做到這一點。

回答

0

您可以分配給range一個變量,然後推動它

myrange = iter(range(insheet.rows)) 

for r in myrange: 

    ... 
    next(myrange) 

當然,這range這樣工作在Python 3,如果仍然Python的2下這將是xrange

當心了r值不會改變,除非您不僅提前迭代器,而且還將其輸出分配到r

r = next(myrange) 

你也應該CATH潛在StopIteration例外,這可能推動range

+0

在Python 2'xrange'不是一個迭代器,你必須明確地將其定義爲這樣'myrange = ITER(x範圍(insheet.rows))' –

+0

謝謝。我不夠清楚。 – mementum

+0

另外,你確定'range'是python 3中的一個迭代器嗎?我只在這臺機器上安裝了Python 2,所以我無法測試它,但我認爲你也需要將它定義爲這樣: –

0

rrange()一個整數,而不是一個迭代器時提出,這樣你就不能調用它next()

你可以使用一個while循環計數器以代替for循環:

try: 
    r = 0 
    while r < insheet.nrows: 
     cdat = insheet.cell(r, 0).value 
     if not cdat == xlrd.empty_cell.value: 
      if hasNumbers(cdat): 
       #Strip digits to get Client pneumonic 
       #pdb.set_trace() 
       if re.sub(r'\d','',cdat) == CLNTID: 
        #pdb.set_trace() 
        #This call belongs to this client 
        memId = cdat 
        r += 1 
        while r < insheet.nrows: 
         #Output this line formatted as CallHeader 
         cdat = cdat.strip(insheet.cell(r, 0).value) 
         if cdat == u"Call Resolved": 
          break 
         #Inc row counter 
         r += 1 
     r += 1