Python:在文本文件中用浮点数替换字符串

1 投票
4 回答
3945 浏览
提问于 2025-04-16 22:03

这里有个问题。

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

撰写回答