前言

template.py, 此 Python 脚本, 意在对模板文件的占位符的内容进行更换.

测试输入 test.txt 的内容为:

这个用户的名称为:{name}, 密码为:{pass}

使用方式:

python ./template.py -i ./test.txt -o ./test2.txt -f name:test,pass:123

表示对输入文件的内容进行占位的替换 -f 后面跟格式化的键值对, key 和 value 成对出现, 表示对内容中的 name 替换为 test, pass 替换为 123

文件输出内容为:

这个用户的名称为:test, 密码为:123

template.py 的实现代码为:

import argparse
from pathlib import Path
from icecream import ic


def main():
    # 参数解析
    parser = argparse.ArgumentParser()
    # 添加参数
    parser.add_argument(
        "-f",
        "--format",
        type=str,
        default="",
        help="格式化的键值对",
    )
    parser.add_argument(
        "-ms",
        "--match_start",
        type=str,
        default="{",
        help="匹配的开始符号",
    )
    parser.add_argument(
        "-me",
        "--match_end",
        type=str,
        default="}",
        help="匹配的结束符号",
    )
    parser.add_argument(
        "-i",
        "--input",
        type=str,
        required=True,
        help="输入的文件",
    )
    parser.add_argument(
        "-o",
        "--output",
        type=str,
        required=True,
        help="输出的文件名",
    )

    args = parser.parse_args()
    ic(args)

    formatValue = args.format
    match_start_value = args.match_start
    match_end_value = args.match_end
    inputValue = args.input
    outputValue = args.output
    ic(formatValue)
    ic(match_start_value)
    ic(match_end_value)
    ic(inputValue)
    ic(outputValue)

    inputFilePath = Path(inputValue)
    ic(inputFilePath)
    if inputFilePath.exists() == False:
        raise Exception("输入的文件不存在")

    if "" == formatValue:
        ic("没有格式化的键值对")
        return

    # 使用逗号分隔
    formatList = formatValue.split(",")
    ic(formatList)

    # 检查每一项中是否有:这个符号, 并且检查:的前后是否有值, 不满足则抛出异常
    for item in formatList:
        if ":" not in item:
            raise Exception("格式化的键值对中没有:这个符号")
        if item.split(":")[0] == "" or item.split(":")[1] == "":
            raise Exception("格式化的键值对中:的前后没有值")

    # 对输入的文件进行读取为 String
    with open(inputValue, "r") as fi:
        intputFileStr = fi.read()
        outputFileStr = intputFileStr
        # 对内容中的 {name} 匹配的进行替换
        for format_item in formatList:
            outputFileStr = outputFileStr.replace(
                match_start_value + format_item.split(":")[0] + match_end_value,
                format_item.split(":")[1],
            )
        # 输出到文件
        with open(outputValue, "w") as fo:
            fo.write(outputFileStr)


# 判断 __main__
if __name__ == "__main__":
    main()



版权声明:本文为u011692041原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u011692041/article/details/130317873