Python:在文本文件中用浮点数替换字符串
这里有个问题。
我有一个 .py 文件和一个 .txt 文件。为了简单起见,我的 .txt 文件内容大概是这样的:
@x@
在 .py 文件中,我有:
x=15
我想把 .txt 文件中的 @x@ 替换成 .py 文件里保存的值,也就是说,我希望我的 .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)'))
问题是“replace”这个方法似乎只处理字符串,而我需要先计算出字符串的值。有没有什么办法可以做到这一点?
谢谢
4 个回答
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()
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
这样你就可以在模板中随意使用多个替换,几乎可以处理任何复杂度的情况。这种方法能够优雅地处理非常非常多的情况。
7
只需要去掉str(x)
中的引号就可以了。
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', str(x)))
如果你想对输出有更多的控制,可以使用格式字符串。比如说,想要保留两位小数。
for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)):
sys.stdout.write(line.replace('@x@', "%.2f"%x))