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

时间:2009-07-13 16:50:53

标签: python foreach mencoder

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

  1. 查看文件夹“/ input”
  2. 对于该文件夹中的每个视频,运行一个mencoder命令(将它们转码为可在手机上播放的内容)
  3. mencoder完成运行后,删除原始视频。
  4. 这似乎不太难,但我吮吸python:)

    关于脚本应该是什么样子的任何想法?

    奖金问题:我应该使用

      

    使用os.system

      

    subprocess.call

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

      

    cmdLine = ['mencoder',              sourceVideo,              '-ovc',              '复制',              '-oac',              '复制',              '-ss',              '00:02:54' ,              '-endpos',               '00:00:54' ,              '-o',              destinationVideo]

    编辑:好的,有效:

    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命令,因为我还在努力。

    感谢大家的意见。

7 个答案:

答案 0 :(得分:98)

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

然后循环遍历文件名。像这样:

import os
for filename in os.listdir('dirname'):
     callthecommandhere(blablahbla, filename, foo)

如果您更喜欢子进程,请使用子进程。 : - )

答案 1 :(得分:25)

使用os.walk以递归方式遍历目录内容:

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会更好。在配置文件中从用户收到。

答案 2 :(得分:11)

Python对此可能过度。

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

答案 3 :(得分:3)

Python3 中新的推荐方式是使用 pathlib

from pathlib import Path

mydir = Path("path/to/my/dir")
for file in mydir.glob('*.mp4'):
    print(file.name)
    # do your stuff

您可以使用任何过滤器来代替 *.mp4,甚至是像 **/*.mp4 这样的递归过滤器。如果您想使用多个扩展名,您可以简单地使用 ***/*(递归)迭代所有文件并使用 file.name.endswith(('.mp4', '.webp', '.avi', '.wmv', '.mov'))

检查每个文件的扩展名

答案 4 :(得分:2)

AVIMPG(选择您的扩展程序):

files = os.listdir('/input')
for sourceVideo in files:
    if sourceVideo[-4:] != ".avi"
        continue
    destinationVideo = sourceVideo[:-4] + ".mpg"
    cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss',
        '00:02:54', '-endpos', '00:00:54', '-o', destinationVideo]
    output1 = Popen(cmdLine, stdout=PIPE).communicate()[0]
    print output1
    output2 = Popen(['del', sourceVideo], stdout=PIPE).communicate()[0]
    print output2

答案 5 :(得分:1)

或者你可以使用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)

答案 6 :(得分:1)

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

它可以转换1个视频并剪切它或者可以转换文件夹中的所有视频,重命名它们并将它们放在子文件夹/ VCD中

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

我把代码和文件放在这里btw:http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/