修改python脚本以在目录中的每个文件上运行

时间:2010-07-13 21:44:51

标签: python

所以我有一个python脚本,它将文件名作为命令参数并处理该文件。但是,因为我有263个文件需要相同的处理,我想知道是否可以使用for循环修改命令参数部分以连续运行文件夹中的所有文件?干杯,周六

编辑:

系统参数的代码在这里:

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循环来修改它。

5 个答案:

答案 0 :(得分:10)

实际上,无论你使用什么shell,都可能有一些语法可以很容易地用于此。在Bash中,例如:

for f in *; do python myscript.py $f; done

要在Python中实际执行此操作,我建议您构建程序,以便主代码位于一个带有一个参数(文件名)的函数中。

def process(filename):
    ...code goes here...

然后你可以像这样调用这个函数,

for f in os.listdir(folder):
    process(f)

folder可以作为命令行参数传递,或者只是写入脚本(如果它不是你要重用的东西)。

编辑:为了回应您的编辑,我建议只使用常规命令行参数提供文件名,而不使用-r选项,这样他们就会结束在args。然后就可以了

for f in args:
    process(f)

或者如果您希望将目录名称作为命令行参数传递,

for d in args:
    for f in os.listdir(d):
        process(f)

或者,我想您可以传递-r选项的多个实例,然后执行

for opt, arg in opt_list:
    if opt == '-r':
        process(arg)

答案 1 :(得分:5)

当我处理多个文件/文件夹时,我通常使用os.walk:

import os
for root, dirs, files in os.walk(dir):
   for fname in files:
       do_something(fname) 

从getopt或optparse获取您的目录。 此外,如果需要,可以使用os.path.abspath构建绝对路径。

current_file = "%s%s%s" % (os.path.abspath(root), os.path.sep, fname)
do_something(current_file)

答案 2 :(得分:4)

os.walk()听起来可能会在这里发挥作用。

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

现在,您需要做的就是传递您想要遍历的目录和一个函数,它将在每个文件上执行代码。

os.walk()也遍历所有子目录。

答案 3 :(得分:1)

是的,您可以像这样修改它。循环遍历参数而不是索引第一个元素。

答案 4 :(得分:1)

我建议你的'main'应该处理选项后给出的每个文件。也就是说,在“args”变量中。不要使用“-r”传递路径,这限制了您的灵活性。如果在程序中使用os.walk()等,则需要系统仅在文件树上工作,这使得定制和开发变得更加困难。

如果程序使用路径列表,则非常易于以不同方式使用。例如,您可以列出一个数据文件进行测试。要处理目录,请执行“myprogram dir / * .dat”。要处理文件树,请使用反引号:

myprogram `find . -name "*.dat"`

最后你可以做很便宜的并行处理。类似的东西:

find . -name '*.dat' | xargs -P 5 myprogram

您的程序的五个副本并行运行。没有锁定或叉子或螺纹或其他必要的同步。

(上面假设您使用的是Linux / OSX类型系统。)