Exercise 4.1 - Solution

# report.py
import fileparse

def read_portfolio(filename):
    '''
    Read a stock portfolio file into a list of dictionaries with keys
    name, shares, and price.
    '''
    return fileparse.parse_csv(filename, select=['name','shares','price'], types=[str,int,float])

def read_prices(filename):
    '''
    Read a CSV file of price data into a dict mapping names to prices.
    '''
    return dict(fileparse.parse_csv(filename,types=[str,float], has_headers=False))

def make_report(portfolio,prices):
    '''
    Make a list of (name, shares, price, change) tuples given a portfolio list
    and prices dictionary.
    '''
    rows = []
    for stock in portfolio:
        current_price = prices[stock['name']]
        change        = current_price - stock['price']
        summary       = (stock['name'], stock['shares'], current_price, change)
        rows.append(summary)
    return rows

def print_report(reportdata):
    '''
    Print a nicely formated table from a list of (name, shares, price, change) tuples.
    '''
    headers = ('Name','Shares','Price','Change')
    print ('%10s ' * len(headers)) % headers
    print ('-'*10 + ' ')*len(headers)
    for row in reportdata:
        print '%10s %10d %10.2f %10.2f' % row

def portfolio_report(portfoliofile,pricefile):
    '''
    Make a stock report given portfolio and price data files.
    '''
    # Read data files
    portfolio = read_portfolio(portfoliofile)
    prices    = read_prices(pricefile)

    # Create the report data
    report    = make_report(portfolio,prices)

    # Print it out
    print_report(report)

if __name__ == '__main__':
    portfolio_report('Data/portfolio.csv',
                     'Data/prices.csv')

[ Back ]