这是一个问题。
我有.py文件和.txt。 为了简化,我的.txt看起来像:
@x@
在.py中我有
x=15
我想用py中保存的值替换txt中的@ x @,即我的txt应该看起来像
15
我试过这个:
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', 'x'))
或
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', 'str(x)'))
问题是“替换”方法似乎只考虑字符串,我需要评估字符串的值。 知道怎么做吗?
谢谢
答案 0 :(得分:9)
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>)"
鉴于此类定义,您现在可以执行此操作
with open( 'a.txt', 'r' ) as source:
t = MyTemplate(source.read())
result= t.substitute( x=15 )
print result
这允许您在模板中的任何位置使用任意数量的替换,几乎任何复杂性。这可以优雅地处理非常大量的案例。
答案 1 :(得分:7)
暂停引号str(x)
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', str(x)))
如果您想要更多地控制输出,可以使用格式字符串。例如2位小数
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', "%.2f"%x))
答案 2 :(得分:0)
不确定是否需要仅替换'x'或文件中还有其他变量,但如果是这样,我认为您也可以使用以下代码:
# preparing dict based on a.py
d1 = {}
for line in open('a.py','r'):
if line.strip() and '=' in line:
k,v = line.strip().split('=')
d1['@' + k + '@'] = v
# preparing data from a.txt using dict from a.py
res = ''
for line in open('a.txt','r'):# lines below can be optimized depending on what you really need
for k,v in d1.items():
if k in line:
line.replace(k, v)
res += line '\n'
# write modified data
f = open('a.txt', 'w')
f.write(res.rstrip('\n'))
f.close()
答案 3 :(得分:0)
虽然您已经收到了很好的问题答案,但还有另一种方法。在文本文件中使用python格式化字符串(例如%(x)f
或%(x)s
)。此示例显示了它的工作原理:
line = '%(x)f or %(x).2f or %(x)s'
x = 15
print line % locals()
您可以使用字典(例如print line % {'x': 15}
)代替locals()。我使用它作为在python中实现模板的快速而肮脏的方式。