14

I am creating a very rudimentary "Address Book" program in Python. I am grabbing contact data from a CSV file, the contents of which looks like the following example:

Name,Phone,Company,Email
Elon Musk,454-6723,SpaceX,[email protected]
Larry Page,853-0653,Google,[email protected]
Tim Cook,133-0419,Apple,[email protected]
Steve Ballmer,456-7893,Developers!,[email protected]

I am trying to format the output so that it looks cleaner and more readable, i.e. everything lined up in rows and columns, like this:

Name:        Phone:        Company:        Email:        
Elon Musk    454-6723      SpaceX          [email protected]

My current code is as follows:

f = open("contactlist.csv")
csv_f = csv.reader(f)
for row in csv_f:
    print(row)

Which naturally due to lack of formatting, produces this, which still looks very unclean.

['Name', 'Phone', 'Company', 'Email']
['Elon Musk', '454-6723', 'SpaceX', '[email protected]']
['Larry Page', '853-0653', 'Google', '[email protected]']
['Tim Cook', '133-0419', 'Apple', '[email protected]']
['Steve Ballmer', '456-7893', 'Developers!', '[email protected]']

Any tips on how to produce a cleaner output would be greatly appreciated, as I am beginner and I find all of this quite confusing. Many thanks in advance.

2 Answers 2

17

You could use format to left justify your output. For example,

f = open("contactlist.csv")
csv_f = csv.reader(f)
for row in csv_f:
    print('{:<15}  {:<15}  {:<20} {:<25}'.format(*row))

Output:

Name             Phone            Company              Email                    
Elon Musk        454-6723         SpaceX               [email protected]         
Larry Page       853-0653         Google               [email protected]          
Tim Cook         133-0419         Apple                [email protected]          
Steve Ballmer    456-7893         Developers!          [email protected]  

You can read more about format here. The < symbol left-aligns the text, and the number specifies the width of the string. Each {} can include a positional argument before the colon : - if they are omitted, the strings will appear in the order of the arguments in the unpacked list row.

Sign up to request clarification or add additional context in comments.

3 Comments

@zarak I tried your solution, but I keep getting IndexError: tuple index out of range any ideas for a solution?
Hi @Vash, Are you running the code on the example shown here?
@zarak No, i tried running it on a bigger csv file.
3

There are a few python modules for creating tables through plain text, e.g. tabulate and prettytable. With tabulate the printing becomes a one-liner:

from tabulate import tabulate
f = open("contactlist.csv")
csv_f = csv.reader(f)
print(tabulate(csv_f, headers='firstrow'))

The output looks like this:

Name           Phone     Company      Email
-------------  --------  -----------  -----------------------
Elon Musk      454-6723  SpaceX       [email protected]
Larry Page     853-0653  Google       [email protected]
Tim Cook       133-0419  Apple        [email protected]
Steve Ballmer  456-7893  Developers!  [email protected]

You can also specify among a bunch of formatting options with the tablefmt keyword. The output of print(tabulate(csv_f,headers='firstrow', tablefmt='pipe')) for example corresponds to markdown table format:

| Name          | Phone    | Company     | Email                   |
|---------------|----------|-------------|-------------------------|
| Elon Musk     | 454-6723 | SpaceX      | [email protected]        |
| Larry Page    | 853-0653 | Google      | [email protected]         |
| Tim Cook      | 133-0419 | Apple       | [email protected]         |
| Steve Ballmer | 456-7893 | Developers! | [email protected] |

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.