次のようなサンプルデータがあります。
ATOM 973 CG ARG A 61 -21.593 8.884 69.770 1.00 25.13 C
ATOM 974 CD ARG A 61 -21.610 7.433 69.314 1.00 23.44 C
ATOM 975 NE ARG A 61 -21.047 7.452 67.937 1.00 12.13 N
オフセット値を追加して 6 列目と 6 列目のみを置き換えたいのですが、上記の場合は 308 です。
61+308 = 369 なので、6 列目の 61 は 369 に置き換える必要があります。
str.split()
行間隔が非常に重要なので、行を作成できません。
使用してみstr.replace()
ましたが、2列目の値が6列目と重複することもあります
行を逆にして使用しようとしstr.repalce()
ましたが、列 7、8、9、10、および 11 の値が置換対象と重複する可能性がありstr
ます。
私がこれまでに持っている醜いコードは次のとおりです(列7、8、9、10および/または11で値が重複する場合とは別に部分的に機能します):
with open('2kqx.pdb', 'r') as inf, open('2kqx_renumbered.pdb', 'w') as outf:
for line in inf:
if line.startswith('ATOM'):
segs = line.split()
if segs[4] == 'A':
offset = 308
number = segs[5][::-1]
replacement = str((int(segs[5])+offset))[::-1]
print number[::-1],replacement
line_rev = line[::-1]
replaced_line = line_rev.replace(number,replacement,1)
print line
print replaced_line[::-1]
outf.write(replaced_line[::-1])
上記のコードは、以下の出力を生成しました。2 行目でわかるように、6 列目は変更されていませんが、7 列目で変更されています。文字列を逆にすることで、2 列目との重複の可能性を回避できると考えましたが、他の列を忘れてしまい、よくわかりません。それを回避する方法。
ATOM 973 CG ARG A 369 -21.593 8.884 69.770 1.00 25.13 C
ATOM 974 CD ARG A 61 -21.3690 7.433 69.314 1.00 23.44 C
ATOM 975 NE ARG A 369 -21.047 7.452 67.937 1.00 12.13 N