在许多文件上运行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
将为您处理这些问题。如果有人能给我一个关于否决票的提示,我很乐意改进我的答案:)