目前,我有一个python脚本,它接收一个文本文件,检查由标签## Somethinghere ##包围的段落,并询问用户他/她想要复制多少次。例如,如果我有文本文件:
Random Text File
##RandomLine1##
Random Line 1
##RandomLine1##
Random Line 2
##RandomLine3##
Random Line 2
##RandomLine3##
End of file
提示用户:
Loop "RandomLine1" how many times?
Loop "RandomLine3" how many times?
用户输入数字后,将按指定的次数复制特定的封闭行,并删除标记。复制多次后的文本输出到指定的输出文件。
要启动脚本,命令如下所示:
python script.py inputfile outputfile
我想要做的不是提示用户输入,用户可以选择输入循环次数作为可选的命令行参数。类似的东西:
python script.py inputfile outputfile --RandomLine1 2 --RandomLine3 2
这是否可以用于python脚本?我附上以下脚本的当前版本:
import re
import argparse
pattern = '##([^#]*)##'
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)
tagChecker = False
strList = []
for line in args.infile:
if tagChecker is True:
lineTest = matcher.search(line)
if lineTest:
tagChecker = False
for _ in range(int(raw_input('Loop ' + lineTest.string[2:-3] + ' how many times?')) - 1):
for copyLine in strList:
args.outfile.write(copyLine)
new_line = matcher.sub("", line)
args.outfile.write(new_line)
strList = []
continue
else:
strList.append(line)
args.outfile.write(line)
if tagChecker is False:
lineTest = matcher.search(line)
if lineTest:
tagChecker = True
new_line = matcher.sub("", line)
args.outfile.write(new_line)
else:
args.outfile.write(line)
args.infile.close()
args.outfile.close()
if __name__ == '__main__':
main()
答案 0 :(得分:2)
是的,您可以通过向参数添加默认值来执行此操作:
parser.add_argument("--RandomLine1", default=None)
# same for RandomLine2
# ...
if args.RandomLine1 is not None:
# use args.RandomLine1 as a number
#...
else:
# RandomNumber1 is not given in the args
#...
答案 1 :(得分:2)
如何使用sys.argv
?
sys.argv
返回脚本以空格分隔的参数列表,其中sys.argv[0]
是脚本的名称。
所以对于以下程序:
import sys
print sys.argv
以下列方式运行时:
python script.py inputfile outputfile --RandomLine1 2 --RandomLine3 2
将产生以下输出:
['script.py', 'inputfile', 'outputfile', '--RandomLine1', '2', '--Randomline3', '2']
如果您想创建一个行字典和相应的参数,请尝试以下几行:
# Get portion of list that isn't the script name or input/output file name
args = sys.argv[3:]
args_dict = {}
i = 0
while i < len(args):
if args[i].startswith('--'):
line = args[i].replace('--', '')
try:
args_dict[line] = int(arg[i+1])
except IndexError:
print "%s has no argument" % line
i += 1
对于您的输入示例,我们将获得args_dict == {'RandomLine1': 2, 'RandomLine3': 2}
。我认为很容易看到如何将字典用于你想要的任何目的。
上述代码当然可以更多/更少地完成,具体取决于您期望输入的可靠性。