Python:用txt文件中的float替换字符串

时间:2011-07-22 11:21:08

标签: python string replace text-files

这是一个问题。

我有.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)'))

问题是“替换”方法似乎只考虑字符串,我需要评估字符串的值。 知道怎么做吗?

谢谢

4 个答案:

答案 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中实现模板的快速而肮脏的方式。