Hướng dẫn python replace placeholder in file - python thay thế trình giữ chỗ trong tệp

Tôi không biết về một thư viện, nhưng đây là cách bạn có thể tự thay thế.

Bạn sẽ không thực sự muốn lặp qua các phím trong từ điển vì sau đó bạn sẽ phải quét văn bản nhiều lần - thay vào đó bạn có thể sử dụng re.sub và tìm kiếm trong từ điển (nhanh chóng) mỗi khi bạn tìm thấy một chuỗi chứa giữa các cặp @@. Bằng cách này, bạn chỉ quét qua văn bản một lần.

Bạn có thể cần phải quyết định phải làm gì nếu không tìm thấy trận đấu, nhưng đây là một ví dụ.

import re

def from_dict(dct):
    def lookup(match):
        key = match.group(1)
        return dct.get(key, f'<{key} not found>')
    return lookup

subs = {"name": "John",
        "age": "40"}

text = "Name: @@name@@ Age: @@age@@ Occupation: @@occupation@@"

print(re.sub('@@(.*?)@@', from_dict(subs), text))

Điều này cho:

Name: John Age: 40 Occupation: 

Dài hơn một chút nhưng có thể tương đương hiệu quả hơn so với get sẽ là một thử nghiệm rõ ràng:

        return dct[key] if key in dct else f'<{key} not found>'

trong đó lưu định dạng chuỗi nếu thực tế là khóa được tìm thấy.

returnEnviron [var]

mất tích_vars.append (var)

#!/usr/bin/env Python
#
# Thay thế $ {Placeholder} trong tệp cấu hình bằng biến môi trường tương ứng của nó.
# Thất bại nếu thiếu một biến.
#
# Thay thế $ {Placeholder} trong tệp cấu hình bằng biến môi trường tương ứng của nó.
#
importargparse,re argparse,re
# Thay thế $ {Placeholder} trong tệp cấu hình bằng biến môi trường tương ứng của nó. os import environ
# Thất bại nếu thiếu một biến. sys import exit
# Phiên bản mới nhất của tập lệnh này có thể được tìm thấy tại https://gist.github.com/micw/d7c0e34aee751e81c5aaa952b29b8631b=[]
verbose=False = False
Fromosimportenviron replace_var(match):
FromSysimportExit=match.group(1)
thiếu_vars = [] verbose:
defreplace_var (khớp): " * Found placeholder ${%s}" % (var)
var = match.group (1) var in environ:
ifverbose: environ[var]
in " * tìm được trình giữ chỗ $ {% s}"% (var).append(var)
return"" ""
ifvarinenviron: main():
returnEnviron [var] = argparse.ArgumentParser(description='Replace placeholders in config.')
mất tích_vars.append (var).add_argument('configfile', metavar='CONFIGFILE', help='Configfile to parse')
DEFMAIN ():.add_argument('outputfile', metavar='OUTPUTFILE', nargs='?', help='Optional output file. If ommitted, the configfile is overwritten')
trình phân tích cú pháp = argparse.argumentparser (description = 'Thay thế trình giữ chỗ trong config.').add_argument('-v', action='store_true', help='Verbose')
Parser.add_argument ('configfile', metavar = 'configfile', help = 'configfile thành parse')) = parser.parse_args()
infile=args.configfile=args.configfile
outfile=args.outputfileifargs.outputfileelseinfile=args.outputfile if args.outputfile else infile
Parser.add_argument ('outputFile', metavar = 'outputFile', nargs = '?', help = 'Tệp đầu ra tùy chọn. verbose
verbose=args.v=args.v
ifverbose: verbose:
In "Người giữ trình xử lý trong %S" %Infile "Processing placeholders in %s" % infile
withopen (infile, 'r') asinstream: open(infile, 'r') as instream:
nội dung = instream.read () = instream.read()
nội dung = re.sub ("\ $ {(.*?)}", thay thế_var, nội dung)=re.sub("\${(.*?)}",replace_var,content)
iflen (thiếu_vars)> 0: len(missing_vars)>0:
in
In "Xử lý lỗi %s:" %Infile "Error processing %s:" % infile
formissing_varinmissing_vars: missing_var in missing_vars:
In " * Biến môi trường bị thiếu: %s" %mất tích_var " * Missing environment variable: %s" % missing_var
in
In "Xử lý lỗi %s:" %Infile(1)
ifverbose: verbose:
formissing_varinmissing_vars: " * Writing changes to %s" % outfile
In " * Biến môi trường bị thiếu: %s" %mất tích_var open(outfile, 'w') as outstream:
Thoát (1).write(content)
In " * Viết thay đổi thành %s" %Outfile __name__ == "__main__":
Withopen (Outfile, 'W') AsoutStream:()