【问题标题】:How to write String template file with multiple loop elements?如何编写具有多个循环元素的字符串模板文件?
【发布时间】:2016-11-06 03:55:42
【问题描述】:

我在字符串模板中编写循环元素时遇到以下小问题:当我尝试从三个循环元素制作字符串模板时,我只能打印最后一个元素,而不是前两个元素。我相信该错误是由于编写文件时出现的一些问题,但我无法了解我的代码的实际问题是什么。所以如果有人能帮我解决这个问题。

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')

【问题讨论】:

  • 只需将print str 转换为Template,您就会看到错误。
  • 感谢您的友好回复。我得到如下打印行:循环元素 $i $j $i $j $i $j 。因此这里是它的打印,但我无法从错误开始的地方得到
  • 我能问一下您为什么要编写完全编写此代码的代码吗?
  • 对不起,我没有关注您的问题,但我正在编写的代码是用于制作具有多个残基位置和残基的 (model.py) 脚本模板

标签: python string templates file-handling stringtemplate


【解决方案1】:

您的模板正在从for 循环中的ij 的最后一个值中获取其替换值。您需要保留上一次迭代中的值。如何?您可以在每次迭代时使用字典和计数来存储和区分值。

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

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


字典在每次迭代中存储ij 的所有值,并且模板中的替换是在字典中的每个键处采用适当的值完成的。这部分应该修复它:

# 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 以避免遮蔽内置 str。在修复之前,不需要对前面的代码块进行其他更改。

【讨论】:

  • 非常感谢。如果你不是我的,你能添加你的代码细节会很有帮助。
  • @DarwinCode 我添加了更多细节 :)
  • 非常感谢它真的帮了很多忙
  • 嗨 Moses,这里有一些问题,当我使用其他变量执行 safe_substitute(d) 时,它类似于 file.write(MM.safe_substitute(Model=Model,pdb=pdb,chains=chains, MDLWRR=MDLWRR,OPTSS=OPTSS,OPMW=OPMW,d=d))。它的打印只遵循 $i_0 $j_0 $i_1 $j_1 $i_2 $j_2 行我可以知道为什么吗?
  • 在这种情况下使用substitute 进行直接替换。 safe_substitute 从字典中替换时很方便。
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多