Alessandro Blasetti Alessandro Blasetti - 24 days ago 19
Python Question

From csv to table-like file

I have a .csv in the following form:

SYSID,DATA,PERIOD_NAME,ORA,MIPS
PROD,2016-11-02,PRIME,10,3459.48
PROD,2016-11-02,PRIME,11,2837.16
PROD,2016-11-02,PRIME,12,2624.15


and I would like to obtain in output something like this

SYSID DATA PERIOD_NAME ORA MIPS
PROD 2016-11-02 PRIME 10 3459.48
PROD 2016-11-02 PRIME 11 2837.16
PROD 2016-11-02 PRIME 12 2624.15


I have tried

import csv
inf = open('pathtofile\\out.csv')
reader=csv.reader(inf)
ofile = open('pathtofile\\fuffa.txt', "wb")
writer = csv.writer(ofile, delimiter='\t')
for row in reader:
writer.writerow(row)


but gives me the following "unformatted table"

SYSID DATA PERIOD_NAME ORA MIPS
PROD 2016-11-02 PRIME 10 3459.48
PROD 2016-11-02 PRIME 11 2837.16
PROD 2016-11-02 PRIME 12 2624.15


I have looked around but I can not find something useful for my problem.
Any hint is very much appreciated.

Answer

You could roll your own column formatter as follows:

import csv

def write_cols(data):
    col_spacer = "   "      # added between columns
    widths = [0] * len(data[0])

    for row in data:
        widths[:] = [max(widths[index], len(str(col))) for index, col in enumerate(row)]

    return [col_spacer.join("{:<{width}}".format(col, width=widths[index]) for index, col in enumerate(row)) for row in data]


with open('input.csv', 'rb') as f_input, open('output.txt', 'w') as f_output:
    rows = list(csv.reader(f_input))

    for row in write_cols(rows):
        f_output.write(row + '\n')

Giving you the following output file:

SYSID   DATA         PERIOD_NAME   ORA   MIPS    
PROD    2016-11-02   PRIME         10    3459.48 
PROD    2016-11-02   PRIME         11    2837.16 
PROD    2016-11-02   PRIME         12    2624.15

This calculates the largest width for all values in each column and then spaces entries accordingly.

Comments