【问题标题】:Modify python script to run on every file in a directory修改python脚本以在目录中的每个文件上运行
【发布时间】:2010-07-13 21:44:50
【问题描述】:

所以我有一个 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 循环来修改它。

【问题讨论】:

    标签: python


    【解决方案1】:

    实际上,您使用的任何 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 选项,以便它们以 @ 结尾987654326@。然后就可以了

    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)
    

    【讨论】:

    • 干杯,我尝试修改代码(为了乐趣和体验)但最终破坏了它......所以我在 bash 中使用了 for 循环,这很奏效!周六
    【解决方案2】:

    当我处理多个文件/文件夹时,我通常使用 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)
    

    【讨论】:

      【解决方案3】:

      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() 也遍历所有子目录。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-02
            • 1970-01-01
            • 1970-01-01
            • 2012-05-02
            • 1970-01-01
            • 1970-01-01
            • 2017-05-05
            • 1970-01-01
            相关资源
            最近更新 更多