2011-07-22 96 views
1

這是一個問題。Python:用txt文件中的float替換字符串

我有一個.py文件和一個.txt文件。 爲了簡化,我.TXT樣子:

@[email protected] 

在的.py我

x=15 

我想通過保存在PY的值,即以取代@ X @在TXT我的TXT應該像

15 

我這個嘗試:

for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)): 
    sys.stdout.write(line.replace('@[email protected]', 'x')) 

for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)): 
    sys.stdout.write(line.replace('@[email protected]', 'str(x)')) 

的問題是,在「替換」方法似乎只考慮串,我需要評估字符串的值。 任何想法如何做到這一點?

感謝

回答

7

見好就收引號關閉str(x)

for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)): 
    sys.stdout.write(line.replace('@[email protected]', str(x))) 

如果你想在輸出可以使用格式字符串更多的控制。例如,對於2位小數

for i, line in enumerate(fileinput.input('mytxtfile.txt', inplace = 1)): 
    sys.stdout.write(line.replace('@[email protected]', "%.2f"%x)) 
+0

謝謝,我已經測試過它,但沒有使用好的txt文件,因爲它已經從我以前的報價嘗試用引號改變了,所以它沒有工作:( – remi

+0

@remi:「不使用好的txt文件,因爲它已經從我以前的報價嘗試改爲「什麼? –

+0

@S。Lott他已經運行了錯誤的代碼,用''str(x)''替換了'@ x @',所以當他試圖運行正確的版本時(即沒有'str(x)'引號) ,它不起作用,因爲輸入文本文件中沒有任何'@ x @'s了。無論如何,這就是我讀到的。 –

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 

這使您可以使用幾乎任何複雜的模板,任何地方的任何數量的替換。這可以很好地處理非常多的案例。

0

儘管您已經收到了很好的問題答案,但還有其他方法。在文本文件中使用python格式化字符串(例如%(x)f%(x)s)。這個例子說明它是如何工作的:

line = '%(x)f or %(x).2f or %(x)s' 
x = 15 
print line % locals() 

您可以使用字典(例如print line % {'x': 15}),而不是本地人()。我使用它作爲一種快速和骯髒的方式來實現Python中的模板。