Python's CSV reader and iteration

csv, iteration, python

Solution

Via generators. You can build all kinds of complexity from simple generator-filter functions. While considerably more complex than your filter, this is more extensible and can easily handle really complex spreadsheets.

def skip_blank( rdr ):
    for row in rdr:
        if len(row) == 0: continue
        if all(len(col)==0 for col in row): continue
        yield row

def after_heading( text, rdr ):
    i= iter(rdr)
    for row in i:
        if any( column == text for column in row ):
            break
    for row in i:
        yield row

def before_footing( text, rdr ):
    for row in rdr:
        if any( column == text for column in row ):
            break
        yield row

def between( start, end, rdr ):
    for row in before_footing( end, after_heading( start, rdr ) ):
        yield row

for row in between( 'Grand Total', 'Client Account', skip_blank( inputFile ) ):
    print row

Problem

I have a CSV file that looks like this: ``` "Company, Inc.",,,,,,,,,,,,10/30/09 A/R Summary Aged Analysis Report,,,,,,,,,,,,10:35:01 All Clients,,,,,,,,,,,,USER Client Account,Customer Name,15-Jan,16 - 30,31 - 60,61 - 90,91 - 120,120 - Over,Total,Status,Credit Limit 1000001111,CLIENT A,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00" 1000002222,CLIENT B,0,0,0,"3,591.27",0,0,"3,591.27",COD,0 1000003333,CLIENT C,536.78,0,0,0,0,"11,216.60","11,753.38",COD,0 1000004444,CLIENT D,0,514.94,"3,147.45",690,0,0,"4,352.39",COD,0 Grand Total,,"139,203,856.06","84,607,749.30","110,746,640.18","58,474,379.45","52,025,869.06","292,653,734.82","737,712,228.87",,,, ``` But I only want to process the lines after the line "Client Account..." and before "Grand Total..." Here's the code that I'm using now: ``` inputFile = csv.reader(open(filename), dialect='excel') records = [line for line in inputFile if line and line[0].isdigit()] ```

Original source