Reputation: 151
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.
Upvotes: 14
Views: 25236
Reputation: 31
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] |
Upvotes: 3
Reputation: 3003
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
.
Upvotes: 17