在许多文件上运行python脚本
我有一组文件,在许多文件上运行python脚本,python,shell,Python,Shell,我有一组文件,aaa_cntrl.txt,bbb_cntrl.txt,…zzz_cntrl.txt。我想在每个文件上运行一个python脚本script.py,并生成输出aaa_out.txt,bbb_out.txt,…zzz_out.txt 我的python脚本是 import sys file_in = sys.argv[0] file_out = sys.argv[1] print "This is the input file", file_in print "This is the o
aaa_cntrl.txt
,bbb_cntrl.txt
,…zzz_cntrl.txt
。我想在每个文件上运行一个python脚本script.py,并生成输出aaa_out.txt
,bbb_out.txt
,…zzz_out.txt
我的python脚本是
import sys
file_in = sys.argv[0]
file_out = sys.argv[1]
print "This is the input file", file_in
print "This is the output file", file_out
命令行是python script.py aaa_cntrl.txt aaa_out.txt
但我想自动将输入指定为*\u cntrl.txt
,并将输出指定为*\u out.txt
。
如何执行此操作?您需要循环所有输入文件并确定脚本中的输出名称,然后shell(至少在linux/unix上)将为您展开通配符
import sys
for file_in in sys.argv[1:]:
# probably some more reliable way is required here in production
file_out = file_in.split('_', 1)[0] + '_out.txt'
print "This is the input file", file_in
print "This is the output file", file_out
几天前,我刚刚使用
argparse
完成了这项工作
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('files', nargs='+')
args = parser.parse_args()
for f in args.files:
process(f)
然后,只需使用/myscript.py*_cntrl.txt
调用脚本,您的shell将执行扩展,正如Willem Van Onsem在评论中指出的那样。您还可以查看
argparse.FileType
以改进此代码
如果文件名格式正确,我建议您根据输入文件自动创建输出文件名。
我的意思是,如果总是将xxx\u cntrl.txt
转换为xxx\u out.txt
,您只需执行file\u out=file\u in.replace(“cntrl”,“out”)
否则,您可以执行以下操作
parser.add_argument('files', nargs='+')
parser.add_argument('-o', nargs='+')
args = parser.parse_args()
for in_file, out_file in zip(args.file, args.o):
process(in_file, out_file)
无论如何,我真的建议您使用
argparse
模块,而不是手动解析sys.argv
argv[0]
提供脚本的名称……此外,请注意,如果您编写*\u cntrl.txt
,shell将执行扩展。所以Python只能看到Python script.py aaa_cntrl.txt bbb_cntrl.txt…
。至于如何做到这一点,shell globbing或find
将为您处理这些问题。如果有人能给我一个关于否决票的提示,我很乐意改进我的答案:)