使用Python对文件夹中的每个文件执行命令
我正在尝试创建一个Python脚本,具体要求是:
- 查看“/input”文件夹
- 对文件夹中的每个视频,运行一个mencoder命令(把它们转码成可以在我手机上播放的格式)
- 一旦mencoder完成了工作,就删除原始视频。
这看起来并不难,但我对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命令,因为我还在继续完善它。
感谢大家的建议。
7 个回答
在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'))
来检查每个文件的扩展名。
使用 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 绝对更好,因为你不需要对文件名进行任何特殊处理。而当你需要接受任何有效的命令行指令时,比如从配置文件中接收到的用户输入,os.system 就更合适了。
要找到所有的文件名,可以使用 os.listdir()
这个函数。
接着,你可以对这些文件名进行循环处理。像这样:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
如果你更喜欢使用 subprocess,那就用 subprocess 吧。:-)