CSS属性的Python文件内容替换

时间:2018-04-27 14:59:13

标签: python html css python-3.x

所以我有2个文件:config.txt和一个CSS文件。

我想要做的是从配置文件中读取color属性并将其替换为CSS文件。

配置文件:

color: #ffffff;

CSS文件:

body{ color: #000000;} h1{color:#000000;}

我需要做的是用配置文件color替换CSS文件color,如何使用Python文件操作替换color h1标签而不是body标签?

1 个答案:

答案 0 :(得分:0)

您可以结合使用fileinput模块进行就地文件编辑,使用re正则表达式模块对该特定h1代码进行搜索和替换。

首先是代码:
(注意我使用" config.txt"用于配置文件," output.css"用于CSS文件)

# read the color from the config file
color_config = ""
with open("config.txt", "r") as config_file:
    for line in config_file:
        if line.startswith("color"):
            color_config = "h1 {" + line.strip() + "}"
            break

# update the css file in-place
with fileinput.input(files=("output.css"), inplace=True) as css_file:
    for line in css_file:
        # the h1 tag could be on its own line or could be part of
        # a line with other styles, so we capture them in groups
        matches = re.match(r"(.*)(h1\s*\{color:.*\})(.*)", line)
        if matches:
            # group(0): entire matching line
            # group(1): everything before the h1 tag
            # group(2): the h1 tag
            # group(3): everything after the h1 tag
            print(line.replace(matches.group(2), color_config), end="")
        else:
            print(line, end="")

有一些解释:

  • 第一个with块是我们读取配置文件以获取color: #ffffff;值的地方。我在这里假设它已放置在自己的行上(这就是我使用startswith的原因)。我不知道您的配置文件是什么样的,所以只需根据您的需要进行调整即可。
  • 然后,我们将color: #ffffff;存储到color_config,格式为h1 { .. }字符串。我们现在对其进行格式化,以便以后轻松搜索和替换。
  • 第二个with块执行就地文件搜索和替换。它使用fileinput.inputinplace参数设置为True。来自文档:
  

可选的就地过滤:如果关键字参数inplace=True是   传递给fileinput.input()FileInput构造函数,即文件   被移动到备份文件,标准输出被定向到输入   文件(如果已存在与备份文件同名的文件,则为   将被默默地替换)。这使得编写过滤器成为可能   在适当的位置重写其输入文件。如果 backup 参数是   给定(通常为backup='.<some extension>'),它指定   备份文件的扩展名,备份文件仍然存在;通过   默认情况下,扩展名为'.bak',并在输出时删除   文件已关闭。

  • 在第二个with块中,我们读取CSS文件的每一行,替换部分字符串,然后print将其重新发送回同一文件(fileinput重定向{{1} 1}}输出到文件)。在进行就地文件编辑时,最好不要在其他任何地方打开CSS文件。
  • 下一步是从每一行搜索print标记。我们使用re.match执行此操作。我不会进入 long 关于如何使用正则表达式的解释(你必须自己阅读)。我只是描述使用的模式:
  

h1

     

re.match(r"(.*)(h1\s*\{color:.*\})(.*)", line) {H1 {1}}
  (.*) match and group everything before and after the
  tag
  \s* match 0 or more spaces between h1 and {

  • 如代码注释中所述,我们可以使用match.group获取\{, \} match the brackets (escaped, because {} are regex special chars)标记。
  • 最后一步是使用先前读取的color:.* match any number of characters between color: and }执行实际string replacement,然后将其打印到文件中。请注意,我可选择将h1传递给color_config,因为默认情况下end=""输出包含换行符。同样,我不知道你的CSS文件是什么样的,所以根据需要进行调整。