使用字符串模板时如何在单行中附加所有循环元素?
How to append all the loop elements in single line while using string Template?
我试图通过使用字符串模板为 example.py 创建一个模板,其中我将每个替换为 $i ["CA:"+$i[=37= 中的循环元素]+':'+" "]。部分有效,但仅替换最后一个元素。
但是,我想以特定格式在单行中附加所有值。
例如:
我当前的脚本如下:
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)))
一个问题是您的代码,因为它以 'w'
模式打开输出文件,所以在 for 循环的每次迭代中都会覆盖该文件。这就是为什么您只能看到文件中的最后一个。
我也不会使用 string.Template
来执行这些替换。只需使用 str.format()
. Generate a list of selections and use 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()
.
本例中我使用了Python内置的format
字符串方法,比较容易理解。如果您更喜欢使用字符串模板,您可以轻松调整它。
诀窍是观察有两个单独的操作要执行:
- 创建参数列表
- 替换所需输出行中的参数列表
我使用 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))
我试图通过使用字符串模板为 example.py 创建一个模板,其中我将每个替换为 $i ["CA:"+$i[=37= 中的循环元素]+':'+" "]。部分有效,但仅替换最后一个元素。
但是,我想以特定格式在单行中附加所有值。
例如:
我当前的脚本如下:
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)))
一个问题是您的代码,因为它以 'w'
模式打开输出文件,所以在 for 循环的每次迭代中都会覆盖该文件。这就是为什么您只能看到文件中的最后一个。
我也不会使用 string.Template
来执行这些替换。只需使用 str.format()
. Generate a list of selections and use 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()
.
本例中我使用了Python内置的format
字符串方法,比较容易理解。如果您更喜欢使用字符串模板,您可以轻松调整它。
诀窍是观察有两个单独的操作要执行:
- 创建参数列表
- 替换所需输出行中的参数列表
我使用 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))