2016-06-03 7 views
0

Ich habe Probleme beim Lesen einer Datei, in der die Zeilen unterschiedliche Längen haben. Insbesondere weiß ich, dass die Datei 13 Zeilen lang ist und dass die Zeilen 1 und 13 2 Werte enthalten, wobei der Rest (2-12) 4 hat. Ich möchte einen Wert aus Zeile 1 und einen Wert aus Zeile 13 und erhalten ein Wert von jeder der Zeilen 2-12, abhängig davon, ob ihr vorhergehender Wert gleich "Guthaben" oder "Soll" ist oder nicht. Da die Zeilen unterschiedliche Längen haben, erhalte ich einen 'index out of range' Fehler. Jede Hilfe würde sehr geschätzt werden. Vielen Dank!Probleme beim Lesen von CSV-Dateien mit Zeilen unterschiedlicher Spaltenanzahl

class Checkbook: 
"""Checkbook class for list of check transactions""" 

def __init__(self, filename): 
    """initializer for Checkbook class""" 

    self.name = filename 
    self.debitList = [] 
    self.creditList = [] 
    self.startAmt = 0 
    self.endAmt = 0 
    self.shouldBeBal = 0 

    with open(filename) as csvFile: 
     readCSV = csv.reader(csvFile, delimiter = ',') 

     #rowCount = sum(1 for row in readCSV) - 1 
     #print(rowCount) 

     next(csvFile) 

     #in range(1, rowCount, 1): 

     for row in readCSV: 
      if (row[2] == " debit"): 

       debitAmt = row[3] 
       self.debitList.append(debitAmt) 

      elif (row[2] == " credit"): 
       creditAmt = row[3] 
       self.creditList.append(creditAmt) 
+0

'len (row)' gibt Ihnen die Länge einer Reihe, so dass Sie können es in Ihrer Logik verwenden. – leekaiinthesky

Antwort

1

Nun, müssen Sie entweder vermeiden, dass die IndexError

for row in readCSV: 
    if len(row) > 2: # make sure the row is long enough 
     if (row[2] == " debit"): # now this can't fail 
      # ... 
     elif (row[2] == " credit"): 
      # ... 

oder damit umgehen:

for row in readCSV: 
    try: 
     if (row[2] == " debit"): 
      # ... 
     elif (row[2] == " credit"): 
      # ... 
    except IndexError: 
     pass # do nothing 
+0

Das hat funktioniert! Vielen Dank! – evanhaus

Verwandte Themen