Python3 f字符串与.replace

问题描述

我有一个文本文件,其中大部分文本都是样板文件,根据文件所属的空间,我将在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))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...