gpt4 book ai didi

python - 如何扩展此搜索和替换 python 脚本以从命令行接受变量?

转载 作者:太空宇宙 更新时间:2023-11-04 01:39:19 25 4
gpt4 key购买 nike

目前,我有一个执行以下操作的脚本。如果我有包含以下行的文本文件:

<<Name>> is at <<Location>>.
<<Name>> is feeling <<Emotion>>.

脚本会将此输入文件作为命令行参数并提示用户输入变量:

Name? Bob
Location? work
Emotion? frustrated

请注意,名称只会被询问一次。该脚本还将输出文件作为参数,并将以下内容放入文件中。

Bob is at work.
Bob is feeling frustrated.

现在我正在尝试扩展脚本,以便我可以从命令行输入变量(就好像我已经知道它要问什么一样)。所以命令就像(在这种情况下):

python script.py infile outfile Bob work frustrated

它会生成相同的输出。理想情况下,如果在命令行中输入的变量之后还有更多剩余变量,扩展应该提示用户输入剩余变量。因此,如果我将脚本运行为:

python script.py infile outfile Bob work

脚本仍然会提示:

Emotion?

命令行中多余的变量将被忽略。我是 Python 的新手,所以虽然这看起来很简单,但我还没有成功地使用这个附加组件更新我当前的脚本。附件是脚本:

import argparse
from os import path
import re

replacements = {}
pattern = '<<([^>]*)>>'

def user_replace(match):
## Pull from replacements dict or prompt
placeholder = match.group(1)
if placeholder in replacements:
return replacements[placeholder]
## .setdefault(key, value) returns the value if present, else sets it then returns
return replacements.setdefault(placeholder, raw_input('%s? ' % placeholder))

def main():
parser = argparse.ArgumentParser()
parser.add_argument('infile', type=argparse.FileType('r'))
parser.add_argument('outfile', type=argparse.FileType('w'))
args = parser.parse_args()

matcher = re.compile(pattern)

for line in args.infile:
new_line = matcher.sub(user_replace, line)
args.outfile.write(new_line)

args.infile.close()
args.outfile.close()

if __name__ == '__main__':
main()

编辑:上面的输入文件示例是任意的。实际上,输入文件可以有任意数量的变量,重复任意次数。

最佳答案

好的,如果你想动态生成选项:

parser = argparse.ArgumentParser()
parser.add_argument('infile', type=argparse.FileType('r'))
parser.add_argument('outfile', type=argparse.FileType('w'))

required, extra = parser.parse_known_args()
infile, outfile = required.infile, required.outfile

args = re.findall(pattern, infile.read())
infile.seek(0)

parser = argparse.ArgumentParser()
for arg in args:
parser.add_argument('--' + arg.lower())

replacements = vars(parser.parse_args(extra))

这将为您提供所有参数的字典。每个参数值都是列表中的一个字符串。然后你就做

def user_replace(match):
"""Pull from replacements dict or prompt"""
placeholder = match.group(1)
return (replacements[placeholder][0]
if placeholder in replacements else
raw_input('%s? ' % placeholder))

编辑:我编辑了顶部的代码以设置参数。这样,参数是可选的,你可以有任何数字。在 replacements 中,他们的名字仍然是 namelocationemotion

用户现在可以:

python script.py infile outfile --name Bob --emotion 'extremely frustrated'

省略他们想要提示的那些,并用引号将空格括起来。

编辑 2:编辑顶部,以便它动态地从文本文件中获取 args。

关于python - 如何扩展此搜索和替换 python 脚本以从命令行接受变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6791712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com