如何编写具有多个循环元素的字符串模板文件?

时间:2016-07-04 12:05:44

标签: python string templates file-handling stringtemplate

我在编写字符串模板中的循环元素时遇到的问题如下:当我尝试从三个循环元素创建一个字符串模板时,我能够只打印最后一个元素而不是前两个元素。我相信错误是由于写入文件中的一些问题,但我无法得到我的代码的实际问题。所以,如果有人可以帮助我这个。

My SCRIPT:

from string import Template
import os

AMONIOACIDS = {'A': 'ALA', 'C': 'CYS', 'E': 'GLU', 'D': 'ASP', 'G': 'GLY',
           'F': 'PHE', 'I': 'ILE', 'H': 'HIS', 'K': 'LYS', 'M': 'MET',
           'L': 'LEU', 'N': 'ASN', 'Q': 'GLN', 'P': 'PRO', 'S': 'SER',
           'R': 'ARG', 'T': 'THR', 'W': 'TRP', 'V': 'VAL', 'Y': 'TYR'}

rPrS={'C': '102', 'A': '104','H': '12'}


a=[]
b=[]
count=1
for single, third in AMONIOACIDS.iteritems():
   for rS,rP in rPrS.iteritems():
       if rS == single:
            a.append(["s"+str(count)+"=selection(mdl1.chains["+chain+"].residues["+rP+"])"])
            b.append(["s"+str(count)+".mutate(residue_type='"+third+"')"])


str='''Loop elements\n'''
for i,j in zip (a,b):
    i=''.join(i)
    j=''.join(j)
    str+='''$i\n'''
    str+='''$j\n'''
str=Template(str)
str.substitute(i=i, j=j)
file = open(os.getcwd() + '/' + 'model.py', 'w')
file.write(str.substitute(i=i,j=j))
file.close()

预期的输出:

Loop elements
s1=selection(mdl1.chains[A].residues[104])
s1.mutate(residue_type='ALA')
s2=selection(mdl1.chains[A].residues[102])
s2.mutate(residue_type='CYS')
s3=selection(mdl1.chains[A].residues[12])
s3.mutate(residue_type='HIS')

我得到的是什么:

Loop elements
s3=selection(mdl1.chains[A].residues[12])
s3.mutate(residue_type='HIS')
s3=selection(mdl1.chains[A].residues[12])
s3.mutate(residue_type='HIS')
s3=selection(mdl1.chains[A].residues[12])
s3.mutate(residue_type='HIS')

1 个答案:

答案 0 :(得分:1)

您的模板从i循环中的jfor的最后一个值获取其替换值。您需要保留上一次迭代的值。怎么样?您可以使用字典和计数来存储和区分每次迭代的值。

你可以substitute values in a template using a dictionary。我已经使用count变量在每次迭代时创建相应的字典键:i_0i_1i_2j_0j_1,{{1} }。这些相同的名称在模板j_2$i_0$i_1$i_2$j_0$j_1中用作标识符。

$j_2安全地将每个密钥的值替换为模板,例如密钥safe_substitute到模板标识符i_0

字典在每次迭代时存储$i_0i的所有值,并且模板中的替换是在字典中的每个键处获取适当的值。这部分应该解决它:

j

我已将# your previous lines of code count = 0 d = {} s='''Loop elements\n''' for i,j in zip (a,b): d['i_{}'.format(count)] = ''.join(i) d['j_{}'.format(count)] = ''.join(j) s+='$i_{}\n'.format(count) s+='$j_{}\n'.format(count) count += 1 print(str) print(d) s=Template(s) file = open(os.getcwd() + '/' + 'model.py', 'w') file.write(s.safe_substitute(d)) file.close() 替换为str,以避免影响内置s。在修复之前,前面的代码块中不需要进行任何其他更改。