Reputation: 387
I have a plain text file that contains user login data:
dtrapani HCPD-EPD-3687 Mon 05/13/2013 9:47:01.72
dlibby HCPD-COS-4611 Mon 05/13/2013 9:49:34.55
lmurdoch HCPD-SDDEB-3736 Mon 05/13/2013 9:50:38.48
lpatrick HCPD-WIN7-015 Mon 05/13/2013 9:57:44.57
mlay HCPD-WAR-3744 Mon 05/13/2013 10:00:07.94
eyoung HCPD-NLCC-0645 Mon 05/13/2013 10:03:01.83
I'm trying to print the data in left- and right-aligned columns:
dtrapani HCPD-EPD-3687 Mon 05/13/2013 9:47:01.72
dlibby HCPD-COS-4611 Mon 05/13/2013 9:49:34.55
lmurdoch HCPD-SDDEB-3736 Mon 05/13/2013 9:50:38.48
lpatrick HCPD-WIN7-015 Mon 05/13/2013 9:57:44.57
mlay HCPD-WAR-3744 Mon 05/13/2013 10:00:07.94
eyoung HCPD-NLCC-0645 Mon 05/13/2013 10:03:01.83
How can I do this?
This is the code I have so far:
with open(r'C:\path\to\logons.txt', 'r') as f:
for line in f:
data = line.strip()
print(data)
Upvotes: 20
Views: 29862
Reputation: 41487
Use the modern f-string syntax:
with open(r'logons.txt', 'r') as f:
for line in f:
s = line.split()
print(f'{s[0]:<10}{s[1]:<17}{s[2]:<5}{s[3]:<12}{s[4]:>12}')
# ^ ^^^ ^^^ ^^ ^^^ ^^^
# f-string left-10 left-17 left-5 left-12 right-12
str.format
Output:
dtrapani HCPD-EPD-3687 Mon 05/13/2013 9:47:01.72
dlibby HCPD-COS-4611 Mon 05/13/2013 9:49:34.55
lmurdoch HCPD-SDDEB-3736 Mon 05/13/2013 9:50:38.48
lpatrick HCPD-WIN7-015 Mon 05/13/2013 9:57:44.57
mlay HCPD-WAR-3744 Mon 05/13/2013 10:00:07.94
eyoung HCPD-NLCC-0645 Mon 05/13/2013 10:03:01.83
Upvotes: 5
Reputation: 1018
I would go for the new(er) print formatter with this one (assuming your fields are consistent). The print/format statement is pretty easy to use and can be found here. Since your data can be seen as a list, you can do a single call to format and supplying the correct formatter data you'll get your output. This has a bit more fine grained control than ljust or rjust but has the downside that you need to know that your data coming in is consistent.
with open(r'C:\path\to\logons.txt', 'r') as f:
for line in f:
data = line.split() # Splits on whitespace
print '{0[0]:<15}{0[1]:<15}{0[2]:<5}{0[3]:<15}{0[4]:>15}'.format(data)
Upvotes: 18
Reputation: 2250
#!/usr/bin/env python
import sys
inputfile = '''dtrapani HCPD-EPD-3687 Mon 05/13/2013 9:47:01.72
dlibby HCPD-COS-4611 Mon 05/13/2013 9:49:34.55
lmurdoch HCPD-SDDEB-3736 Mon 05/13/2013 9:50:38.48
lpatrick HCPD-WIN7-015 Mon 05/13/2013 9:57:44.57
mlay HCPD-WAR-3744 Mon 05/13/2013 10:00:07.94
eyoung HCPD-NLCC-0645 Mon 05/13/2013 10:03:01.83'''.split('\n')
output = sys.stdout
lengths = [10,17,5,14,0]
for line in inputfile:
line = line.split()
for field, fieldlength in zip(line,lengths):
output.write(field.ljust(fieldlength))
output.write('\n')
Upvotes: 0
Reputation: 1061
str.ljust(width, [fillchar=" "])
(http://docs.python.org/2/library/stdtypes.html#str.ljust) seems like what you're after.
Left justify each field when printing to the maximum length + a little bit.
For the last field to match your example, you'll want to right justify it instead using rjust.
Upvotes: 6