1 python string replace text-files
这是一个问题.
我有.py文件和.txt.为了简化,我的.txt看起来像:
@x@
Run Code Online (Sandbox Code Playgroud)
在.py我有
x=15
Run Code Online (Sandbox Code Playgroud)
我想用py中保存的值替换txt中的@ x @,即我的txt应该是这样的
15
Run Code Online (Sandbox Code Playgroud)
我试过这个:
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', 'x'))
Run Code Online (Sandbox Code Playgroud)
或者
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', 'str(x)'))
Run Code Online (Sandbox Code Playgroud)
问题是"替换"方法似乎只考虑字符串,我需要评估字符串的值.知道怎么做吗?
谢谢
这string.Template是一个很好的方法.
http://docs.python.org/library/string.html#template-strings
from string import Template
class MyTemplate( Template ):
delimiter= '@'
pattern= r"@(?P<escaped>@)|@(?P<named>[_a-z][_a-z0-9]*)@|@(?P<braced>[_a-z][_a-z0-9]*)@|@(?P<invalid>)"
Run Code Online (Sandbox Code Playgroud)
鉴于此类定义,您现在可以执行此操作
with open( 'a.txt', 'r' ) as source:
t = MyTemplate(source.read())
result= t.substitute( x=15 )
print result
Run Code Online (Sandbox Code Playgroud)
这允许您在模板中的任何位置使用任意数量的替换,几乎任何复杂性.这可以优雅地处理非常大量的案例.
把报价关掉 str(x)
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', str(x)))
Run Code Online (Sandbox Code Playgroud)
如果您想要更多地控制输出,可以使用格式字符串.例如2位小数
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', "%.2f"%x))
Run Code Online (Sandbox Code Playgroud)