问题描述
我有一个文本文件,其中大部分文本都是样板文件,根据文件所属的空间,我将在Python中更改大约两打变量。哪种替换文本的方法“更好”,将整个文本文件包装成一个用引号引起来的大三元组'f'string'或堆叠一堆.replace()?
文件不是很大,只有大约300个房间,所以对于我来说毫秒并不重要。我认为对于可读性和将来的编辑来说,.replace()方法会更好,但是如果这样做不是一个好主意,我不想养成一个坏习惯。预先感谢您的帮助。
简化的伪代码:
class Thing:
def __init__(self,name,var1,var2,var3):
self.name = name
self.var1 = var1
self.var2 = var2
self.var3 = var3
def doing_it_the_replace_way(thing):
with open('template.txt','r') as file:
file_data = file.read()
file_data = file_data.replace('placeholder_name','name')
file_data = file_data.replace('placeholder1','var1')
file_data = file_data.replace('placeholder2','var2')
file_data = file_data.replace('placeholder3','var3') # etc.
with open('output file.txt','w') as file:
file.write(file_data)
def doing_it_the_f_string_way(thing):
file_data = f"""This is the entire template text from {thing.var1} about the time I got a
{thing.var2} stuck in my {thing.var3} at band camp."""
with open('output file.txt','w') as file:
file.write(file_data)
解决方法
我都不用。
使用正则表达式将更安全(即,您不需要f字符串和评估整个文件)且可扩展(如果您有30个变量,则不需要对str.replace
进行30次调用,只需输入一个在映射dict
中)。
import re
table = {'<time>': '12:00','<date>': '1.1.1970'}
# imagine this being read from a file
string = '<time>,fixed text,<date>'
print(re.sub(r'(<.+?>)',lambda s: table.get(s.group(1),s.group(1)),string))
输出
12:00,1.1.1970
适应您的情况(其中值是对象的属性)
您要做的就是将对象用作映射dict
的值。
...
thing = Thing('name','a','b','c')
table = {'<time>': thing.var1,'<date>': thing.var2}
...
如果您需要做一些更复杂的事情(例如,如果您有多个对象),这可能会变得很麻烦,但是当然可以根据您的实际用例加以改进。
例如,如果占位符的名称与对象中属性的名称一致,则可以使用vars
作为映射(不要忘记删除<
和{{ 1}}(来自正则表达式捕获组):
>
输出
import re
class Thing:
def __init__(self,name,var1,var2,var3):
self.name = name
self.var1 = var1
self.var2 = var2
self.var3 = var3
thing = Thing('name','c')
string = '<var1>,<var2>'
print(re.sub(r'<(.+?)>',lambda s: vars(thing).get(s.group(1),string))