Insert string into string
Mensanator
mensanator at aol.com
Sat Jul 26 19:32:15 EDT 2008
On Jul 26, 4:40�pm, "Francesco Pietra" <chiendar... at gmail.com> wrote:
> I am posting ex novo as it became confusing to me. I take the
> opportunity to ask advice for a second problem.
>
> FIRST PROBLEM
> For file xxx.pdb, insert letter "A" into each line that starts with
> "ATOM". "A" should be inserted at position 22, i.e., one space after
> "LEU", leaving all other characters at the same position as in the
> original example:
>
> ATOM � � �1 �N � LEU � � 1 � � 146.615 �40.494 103.776 �1.00 73.04 � � � 1SG � 2
>
> In all lines starting with "ATOM", "LEU" is constant as to position
> only (18-20), i.e., "LEU" may be replaced by
> three different uppercase letters. Therefore, the most direct
> indication would be position 22. If specifying line starting with
> "ATOM" makes complication, forget about that as most lines begin with
> "ATOM" so that hand correction will be easy.
>
> Script
> f = open("xxx.pdb", "w")
> import sys
>
> for line in sys.stdin:
> � � line = line[:22] + "A" + line[23:]
> � � sys.stdout.write(line)
>
> destroys the xxxx.pdb file and python exits witha non zero exit status.
>
> The same occurs with script
>
> f = open("hASIC1a.B99990003.pdb", "w")
> f.write(' line = line[:22] + "A" + line[23:]')
> f.close()
>
> I must have misunderstood the suggestion I received on previous posting.
> ____________________________________
> SECOND PROBLEM
> File xxx.pdb above has 426 lines stating with "ATOM", this serial
> number occupying positions 7-11, right justified (Thus 1, as in the
> line example above, means first line). A second, similar file yyy.pdb
> has to be concatenated to xxx.pdb. Before that it should be added of
> "A" as above and renumbered at position 7-11, starting from 428 (there
> is an intermediate line to add). How should a script look like for
> this string insertion into string with recursive +1?
>
> Thanks
> francesco
I don't know why you're using stdin if you're reading from a file.
Also, the serial number isn't 7-11, it's 6-10 (remember to
count from 0, so character 1 is position 0, etc.)
fx = open('xxx.pdb','r') # first input file
fy = open('yyy.pdb','r') # second input file
fz = open('zzz.pdb','w') # output file (to be created)
for xline in fx: # read input one line at a time
if len(xline) >= 80: # don't process invalid lines
line_index = int(xline[7:12]) # keep track of this
if xline[:4]=='ATOM':
fz.write(xline[:22] + 'A' + xline[23:])
else:
fz.write(xline)
fx.close() # done with first file
fz.write('the extra line \n')
line_index += 1 # don't forget to count it
for yline in fy: # read second file
if len(yline) >= 80: # again, valid only
line_index += 1 # ignore serial number, use
# where we left off from
# from first file
if yline[:4]=='ATOM':
# note use of .rjust(5) to creat new serial number
fz.write(yline[:6] + \
str(line_index).rjust(5) + \
yline[11:22] + 'A' + yline[23:])
else:
fz.write(yline[:6] + \
str(line_index).rjust(5) + yline[11:])
fy.close() # done with second file
fz.close() # done with output file
More information about the Python-list
mailing list