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

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)

folder可以作为命令行参数传递,也可以直接写入脚本(如果它不是您要重用的东西)。

编辑:为了响应您的编辑,我建议您只将文件名作为常规的命令行参数,而不使用-r选项,这样它们就会出现在args中。那你就可以了

1
2
for f in args:
    process(f)

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

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

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

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)


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

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

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

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


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

如果程序使用的是路径列表,那么很容易以不同的方式使用。例如,您可以列出一个用于测试的数据文件。要处理目录,请执行"myprogram dir/*.dat"。要处理文件树,请使用引号:

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

最后,您可以做非常便宜的并行处理。比如:

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

程序的五个副本并行运行。无需锁定、分叉、线程或其他同步。

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


是的,你可以这样修改它。循环使用参数,而不是索引第一个元素。