2016-07-04 2 views
1

У меня есть небольшая проблема в написании элементов цикла в шаблоне строки следующим образом: когда я пытаюсь создать цепочку строк из трех элементов цикла, я могу напечатать только последний элемент, а не первые два элемента. Я верю, что ошибка связана с некоторыми проблемами в записи файла, но я не мог получить то, что действительно проблема с моим кодом. Итак, если кто-то мог бы вам помочь мне с этим.Как написать файл шаблона String с несколькими элементами цикла?

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

Ожидаемое Ouput:

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

Просто «распечатайте» строку перед преобразованием ее в «Шаблон», и вы увидите свою ошибку. – Selcuk

+0

Спасибо за ваш добрый ответ. Я получаю печатные строки, как показано ниже: Элементы петли $ i $ j $ i $ j $ i $ j. здесь Его печать, следовательно, я не мог получить, откуда начинается ошибка. – DarwinCode

+1

Могу ли я спросить, почему вы пишете код, который вообще пишет этот код? – dodell

ответ

1

Шаблон получает свои значения подстановки из последних значений i и j из цикла for. Вам нужно сохранить значения из предыдущей итерации. Как? Вы можете использовать словарь и счетчик для хранения и различения значений на каждой итерации.

Вы можете substitute values in a template using a dictionary. Я использовал переменную count для создания соответствующих ключей словаря на каждой итерации: i_0, i_1, i_2, и j_0, j_1, j_2. Эти же имена используются в качестве идентификаторов в шаблоне $i_0, $i_1, $i_2 и $j_0, $j_1, $j_2.

safe_substitute безопасно заменяет значение по каждому ключу в шаблон, например, ключ i_0 к идентификатору шаблона $i_0.


Словарные сохраняет все значения i и 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, чтобы избежать затенения str встроенных. Никакие другие изменения не требуются в предыдущих блоках кода до исправления.

+0

Спасибо вам. Если вы не можете добавить подробные сведения о своем коде, это будет очень полезно. – DarwinCode

+0

@DarwinCode Я добавил дополнительную информацию :) –

+0

Спасибо, что он очень помог – DarwinCode

Смежные вопросы