使用Python对文件夹中的每个文件执行命令

使用Python对文件夹中的每个文件执行命令,python,foreach,mencoder,Python,Foreach,Mencoder,我正在尝试创建一个Python脚本,该脚本将: 查看文件夹“/输入” 对于该文件夹中的每个视频,运行mencoder命令(将它们转换为可在手机上播放的内容) mencoder完成跑步后,删除原始视频 这似乎不太难,但我的python很烂:) 对剧本应该是什么样子有什么想法吗 奖金问题:我应该使用吗 操作系统 或 subprocess.call ? Subprocess.call似乎允许更可读的脚本,因为我可以这样编写命令: cmdLine=['mencoder', 源视频, “-ovc”, “复

我正在尝试创建一个Python脚本,该脚本将:

  • 查看文件夹“/输入”
  • 对于该文件夹中的每个视频,运行mencoder命令(将它们转换为可在手机上播放的内容)
  • mencoder完成跑步后,删除原始视频
  • 这似乎不太难,但我的python很烂:)

    对剧本应该是什么样子有什么想法吗

    奖金问题:我应该使用吗

    操作系统

    subprocess.call

    ?

    Subprocess.call似乎允许更可读的脚本,因为我可以这样编写命令:

    cmdLine=['mencoder', 源视频, “-ovc”, “复制”, “-oac”, “复制”, “-ss”, '00:02:54', “-endpos”, '00:00:54', “-o”, 目的地视频]

    编辑:好的,可以:

    import os, subprocess
    
    bitrate = '100'
    mencoder = 'C:\\Program Files\\_utilitaires\\MPlayer-1.0rc2\\mencoder.exe'
    inputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\input'
    outputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\output'
    
    for fichier in os.listdir(inputdir):
        print 'fichier :' + fichier
        sourceVideo = inputdir + '\\' + fichier
        destinationVideo = outputdir + '\\' + fichier[:-4] + ".mp4"
    
        commande = [mencoder,
                   '-of',
                   'lavf',
                   [...]
                   '-mc',
                   '0',
    
                   sourceVideo,
                   '-o',
                   destinationVideo]
    
        subprocess.call(commande)
    
    os.remove(sourceVideo)
    raw_input('Press Enter to exit')
    
    为了清晰起见,我已经删除了mencoder命令,因为我还在处理它


    感谢大家的支持。

    要查找所有文件名,请使用
    os.listdir()

    然后在文件名上循环。像这样:

    import os
    for filename in os.listdir('dirname'):
         callthecommandhere(blablahbla, filename, foo)
    
    如果您更喜欢子流程,请使用子流程。:-)

    用于在目录内容上递归迭代:

    import os
    
    root_dir = '.'
    
    for directory, subdirectories, files in os.walk(root_dir):
        for file in files:
            print os.path.join(directory, file)
    

    这里os.system和subprocess.call之间没有真正的区别——除非您必须处理命名奇怪的文件(文件名包括空格、引号等)。如果是这种情况,subprocess.call肯定更好,因为您不需要对文件名进行任何shell引用。当您需要接受任何有效的shell命令时,例如从配置文件中的用户处收到的命令,os.system会更好。

    AVI
    MPG
    (选择扩展名):


    或者,您也可以使用os.path.walk函数,它比os.walk更适合您:

    一个愚蠢的例子:

    def walk_func(blah_args, dirname,names):
        print ' '.join(('In ',dirname,', called with ',blah_args))
        for name in names:
            print 'Walked on ' + name
    
    if __name__ == '__main__':
        import os.path
        directory = './'
        arguments = '[args go here]'
        os.path.walk(directory,walk_func,arguments)
    

    Python可能在这方面做得太过火了

    for file in *; do mencoder -some options $file; rm -f $file ; done
    

    我有一个类似的问题,在网络的很多帮助下,这篇文章我制作了一个小应用程序,我的目标是VCD和SVCD,我不会删除源代码,但我认为它将很容易适应您自己的需要

    它可以转换一个视频并进行剪切,也可以转换文件夹中的所有视频,重命名它们并将它们放入子文件夹/VCD中

    我还添加了一个小界面,希望别人觉得有用


    我把代码和文件放在这里,顺便说一句:

    Python3中的新推荐方法是使用:

    从pathlib导入路径
    mydir=Path(“Path/to/my/dir”)
    对于mydir.glob('*.mp4')中的文件:
    打印(文件名)
    #做你的事
    


    您可以使用任何筛选器而不是
    **.mp4
    ,甚至是像
    ***.mp4
    这样的递归筛选器。如果您想使用多个扩展名,只需使用
    *
    ***
    (递归)迭代所有扩展名,并使用
    file.name.endswith((“.mp4',“.webp',”.avi',“.wmv',”.mov'))检查每个文件的扩展名。

    这将获得子目录名和文件,并且不会递归到子目录中。这可能是Manu实际需要的,但如果您不希望它在子目录中出错,它就不会那么简单了。输入文件夹应该只包含视频文件,不是吗subdirectories@Maciej:在分机上很容易过滤。还有一个glob也可以使用<代码>导入glob;glob.glob('/tmp/*.py')您能在答案中添加glob位吗?这对通过文件夹进行递归搜索有效吗?对于os.listdir(glob2.glob('/dirname/***.mov'))中的文件名:在这里调用命令这不是他要求的,七年来它一直是公认的答案,所以不,我不会添加它。我认为它不适用于递归搜索。关于如何做到这一点,还有很多其他问题和答案。下面是glob的文档:在第5行中,我想您的意思是sourceVideo[:-4]
    sourceVideo
    只包含路径的基本名称。如果mencoder需要在工作目录中运行,请添加os.chdir('/input')Grr,我仍然有我在上一个问题中遇到的相同问题;“windows找不到指定的文件”。Python和/或windows不支持文件名和文件夹名中的空格:(如果文件路径中有空格,则需要在文件路径周围加上双引号。>>Python可能会有些过火,而不是我的评论所针对的“当你只有一把锤子时,一切看起来都像钉子”。请引用你的变量。还可以使用--.google的“Bash陷阱”为了理解原因。首先,OP要求的是Python而不是Bash,其次,如果你要发布一个答案,你可能应该确保它不会传递@Aleks-DanielJakimenko-A.os.path.walk提到的任何坏习惯。现在,os.walk被弃用,取而代之的是os.walk。这正是我想要的。基本上是Python版本的“find.-type f”在linux命令行上。对python有点陌生:变量名“目录、子目录、文件”是预定义的词还是类似于“self”所以我定义了它们,但这是惯例?如果我只给出两个或一个,会发生什么?在这个博客中有很多与问题无关的代码。如果你拉出相关代码并粘贴到答案中,可能会有所帮助。此外,如果博客发生变化或崩溃,那么这个答案将变得毫无价值,而如果答案中包含代码,它将始终保持有效答案。同意!Pathlib是最佳答案:D
    for file in *; do mencoder -some options $file; rm -f $file ; done