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

我试图创build一个Python脚本,将:

  1. 查看文件夹“/ input”
  2. 对于该文件夹中的每个video,运行mencoder命令(将其转码为可在手机上播放的内容)
  3. mencoder完成运行后,删除原始video。

这似乎不太难,但我吮吸python:)

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

奖金问题:我应该使用

使用os.system

要么

subprocess.call

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

cmdLine =''mencoder',sourceVideo,'-ovc','copy','-oac','copy','-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命令,为清晰起见,因为我仍然在努力。

感谢大家的意见。

要find所有的文件名,使用os.listdir()

然后你循环的文件名。 像这样:

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

如果您更喜欢子stream程,请使用子stream程。 🙂

使用os.walkrecursion遍历目录内容:

 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命令,例如从configuration文件中的用户接收到的命令时,os.system会更好。

Python可能是矫枉过正的。

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

AVIMPG (select你的分机):

 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 

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

我有一个类似的问题,从网上很多的帮助,这个职位,我做了一个小应用程序,我的目标是VCD和SVCD,我不删除源,但我认为这将是相当容易适应自己的需要。

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

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

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