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.

asked Aug 27, 2016 at 2:40

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.

answered Aug 27, 2016 at 2:56
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] |
answered Jun 7, 2022 at 17:38

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.