2016-06-28 4 views
1

Я попытался создать шаблон для example.py с помощью строки Template, где я заменяю каждый элемент цикла в $ i ["CA:" + $ i + ':' + ""]. Частично он работает, но заменяет только последний элемент.Как добавить все элементы цикла в одну строку при использовании строкового шаблона?

Но я хочу добавить все значения в одну строку с определенным форматом.

Например:

Что мой текущий скрипт делает это следующим образом:

for i in range(1,4): 
    #It takes each "i" elements and substituting only the last element 
    str='''s=selection(self.atoms["CA:"+$i+':'+" "].select_sphere(10)) 

Что я получаю выглядит следующим образом:

s=selection(self.atoms["CA:"+3+':'+" "].select_sphere(10)) 

Что, Я ожидаю г выглядит следующим образом:

s=selection (self.atoms["CA:"+1+':'+" "].select_sphere(10),self.atoms["CA:"+2+':'+" "].select_sphere(10),self.atoms["CA:"+3+':'+" "].select_sphere(10)) 

Мой сценарий:

import os 
from string import Template 
for i in range(1,4): 

    str=''' 
    s=selection(self.atoms["CA:"+$i+':'+" "].select_sphere(10)) 
    ''' 
    str=Template(str) 
    file = open(os.getcwd() + '/' + 'example.py', 'w') 
    file.write(str.substitute(i=i)) 
    file.close() 

Я использую эти два сценария, чтобы получить нужный мне результат:

import os 
from string import Template 
a=[] 
for i in range(1,4): 
    a.append(''.join("self.atoms["+ "'CA:' "+str(i)+""':'+" "+"]"+".select_sphere(10)")) 

str='''s=selection($a).by_residue()''' 
str=Template(str) 
file = open(os.getcwd() + '/' + 'example.py', 'w') 
file.write(str.substitute(a=a)) 

with open('example.py', 'w') as outfile: 
    selection_template = '''self.atoms["CA:"+{}+':'+" "].select_sphere(10)''' 
    selections = [selection_template.format(i) for i in range(1, 4)] 
    outfile.write('s = selection({})\n'.format(', '.join(selections))) 

ответ

2

Одна проблема заключается в том, что ваш код, потому что он открывает выходной файл с режимом 'w', перезаписывает файл на каждой итерации цикла for. Вот почему вы видите только последний файл.

Также я бы не использовал string.Template для выполнения этих подстановок. Просто используйте str.format(). Создание списка выбора и использование str.join() для получения конечной строки:

with open('example.py', 'w') as outfile: 
    selection_template = 'self.atoms["CA:"+{}+":"+" "].select_sphere(10)' 
    selections = [selection_template.format(i) for i in range(1, 4)] 
    outfile.write('s = selection({})\n'.format(', '.join(selections))) 

Здесь selection_template использует {} в качестве заполнителя для подстановки переменной и список понимание используются для построения строки выбора. Затем эти строки выбора объединяются, используя строку ', ' в качестве разделителя и результирующую строку, вставленную в вызов selection(), снова используя str.format().

+0

Thanks alot mhawke – DarwinCode

1

В этом примере я использую строковый метод Python format, который относительно легко понять. Если вы предпочитаете использовать строковые шаблоны, вы можете легко адаптировать их.

Хитрость заключается в том, чтобы наблюдать, что есть две отдельные операции для выполнения:

  1. Создать список аргументов
  2. Запасной список аргументов в требуемой выходной линии

Я использую генератор-выражение до join для достижения нужной итерации и части 1, а затем простое форматирование строки для выполнения шага 2.

Я использую метод строки format в качестве связанной функции, чтобы упростить код, аббревиатура вызовов метода.

main_format = ''' 
s = selection({}) 
'''.format 
item_format = 'self.atoms["CA:"+{s}+\':\'+" "].select_sphere(10)'.format 
items = ", ".join(item_format(s=i) for i in range(1, 4)) 
print(main_format(items))