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