Working with fixed format text db's
Frank Millman
frank at chagford.com
Sat Jun 9 04:04:20 EDT 2007
On Jun 8, 5:50 pm, Neil Cerutti <horp... at yahoo.com> wrote:
> Many of the file formats I have to work with are so-called
> fixed-format records, where every line in the file is a record,
> and every field in a record takes up a specific amount of space.
>
> For example, one of my older Python programs contains the
> following to create a fixed-format text record for a batch of new
> students:
>
> new = file("new.dat", "w")
> if not new:
> print "Error. Could not open file new.dat for writing."
> raw_input("Press Return To Exit.")
> sys.exit(1)
>
> for s in freshmen:
> new.write(s.ssn.ljust(9))
> new.write(s.id.ljust(10))
> new.write(s.last[:16].ljust(16))
> new.write(s.first[:11].ljust(11))
> new.write(' '.ljust(10)) # Phone Number
> new.write(' '.ljust(1254)) # Empty 'filler' space.
> new.write('2813 ')
> new.write(s.major.ljust(5))
>
I have to do this occasionally, and also find it cumbersome.
I toyed with the idea of posting a feature request for a new 'fixed
length' string formatting operator, with optional parameters for left/
right-justified and space/zero-filled.
We already have '%-12s' to space fill for a length of 12, but it is
not truly fixed-length, as if the value has a length greater than 12
you need it to be truncated, and this construction will not do that.
Assume we have a new flag '!n', which defaults to left-justified and
space-filled, but allows an optional 'r' and '0' to override the
defaults.
Then the above example could be written as
format = '%!9s%!10s%!16s%!11s%!10s%!1254s%!6s%!5s'
for s in freshmen:
new.write (format %
(s.ssn,s.id,s.last,s.first,
' ',' ','2813',s.major))
I never felt strongly enough about it to propose it, but I thought I
would mention it.
Frank Millman
More information about the Python-list
mailing list