Python: заменить строку с плавающей точкой в ​​текстовом файле - PullRequest
1 голос
/ 22 июля 2011

Вот проблема.

У меня есть файл .py и .txt. Для упрощения мой .txt выглядит так:

@x@

В .py у меня есть

x=15

Я хотел бы заменить @ x @ в тексте на значение, сохраненное в py, т.е. мой текст должен выглядеть как

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 ]

9 голосов
/ 22 июля 2011

Класс 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 голосов
/ 22 июля 2011

просто оставить цитаты выключенными 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))
0 голосов
/ 26 июля 2011

Хотя вы уже получили хорошие ответы на свою проблему, есть альтернативный способ. Используйте строки форматирования Python в своих текстовых файлах (например, %(x)f или %(x)s). Этот пример показывает, как это работает:

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

Вы можете использовать словарь (например, print line % {'x': 15}) вместо местных (). Я использую его как быстрый и грязный способ реализации шаблонов в python.

0 голосов
/ 22 июля 2011

Не уверен, нужно ли вам заменять только '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()
...