Modify python script to run on every file in a directory
所以我有一个python脚本,它将文件名作为命令参数并处理该文件。但是,因为我有263个文件需要同样的处理,所以我想知道命令参数部分是否可以用for循环进行修改,以便连续地运行文件夹中的所有文件?干杯,坐下
编辑:
系统参数的代码如下:
1 2 3 4 5 6 7 | try: opt_list, args = getopt.getopt(sys.argv[1:], 'r:vo:A:Cp:U:eM:') except getopt.GetoptError, msg: print 'prepare_receptor4.py: %s' %msg usage() sys.exit(2) |
其中"r"是需要处理的文件名,其他参数是可选参数。我不知道如何用for循环修改这个。
实际上,无论您使用的是什么shell,都可能有一些易于使用的语法。例如,在bash中:
1 | for f in *; do python myscript.py $f; done |
为了在Python中实现这一点,我建议您对程序进行结构化,使主代码位于一个接受一个参数(文件名)的函数中。
1 2 | def process(filename): ...code goes here... |
号
然后您可以这样调用这个函数,
1 2 | for f in os.listdir(folder): process(f) |
编辑:为了响应您的编辑,我建议您只将文件名作为常规的命令行参数,而不使用
1 2 | for f in args: process(f) |
。
或者,如果您希望将目录名作为命令行参数传递,
1 2 3 | for d in args: for f in os.listdir(d): process(f) |
或者,我想您可以传递
1 2 3 | for opt, arg in opt_list: if opt == '-r': process(arg) |
。
当我处理多个文件/文件夹时,我通常使用os.walk:
1 2 3 4 | import os for root, dirs, files in os.walk(dir): for fname in files: do_something(fname) |
从getopt或optparse获取目录。此外,如果需要,还可以使用os.path.abspath建立绝对路径。
1 2 | current_file ="%s%s%s" % (os.path.abspath(root), os.path.sep, fname) do_something(current_file) |
。
1 2 3 4 5 6 7 8 9 | def traverse_and_touch(directory, touch): ''' General function for traversing a local directory. Walks through the entire directory, and touches all files with a specified function. ''' for root, dirs, files in os.walk(directory): for filename in files: touch(os.path.join(root, filename)) return |
。
现在,您需要做的就是在您想要遍历的目录和一个函数中传递,它将对每个文件执行代码。
我建议您的"主"应该处理选项后给出的每个文件。也就是说,在"args"变量中。不要用"-r"来传递路径,这会限制您的灵活性。如果在程序中使用os.walk()等,则需要系统只在文件树上工作,这使得定制和开发更加困难。
如果程序使用的是路径列表,那么很容易以不同的方式使用。例如,您可以列出一个用于测试的数据文件。要处理目录,请执行"myprogram dir/*.dat"。要处理文件树,请使用引号:
1 | myprogram `find . -name"*.dat"` |
最后,您可以做非常便宜的并行处理。比如:
1 | find . -name '*.dat' | xargs -P 5 myprogram |
。
程序的五个副本并行运行。无需锁定、分叉、线程或其他同步。
(上面假设您使用的是Linux/OSX类型的系统。)
是的,你可以这样修改它。循环使用参数,而不是索引第一个元素。