在许多文件上运行python脚本

时间:2017-03-22 15:07:30

标签: python shell

我有一组文件aaa_cntrl.txtbbb_cntrl.txt,.... zzz_cntrl.txt。我想在每个文件上运行python脚本script.py并生成输出aaa_out.txtbbb_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

但我想自动将输入指定为*_cntrl.txt并将输出设为*_out.txt。 我该怎么做?

2 个答案:

答案 0 :(得分:0)

你需要遍历所有输入文件并确定脚本中的输出名称,然后你的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

答案 1 :(得分:0)

我前几天刚刚使用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_cntrl.txt始终转换为xxx_out.txt,您只需执行file_out = file_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