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

87 投票
7 回答
185885 浏览
提问于 2025-04-15 12:52

我正在尝试创建一个Python脚本,具体要求是:

  1. 查看“/input”文件夹
  2. 对文件夹中的每个视频,运行一个mencoder命令(把它们转码成可以在我手机上播放的格式)
  3. 一旦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 个回答

14

在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')) 来检查每个文件的扩展名。

34

使用 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 就更合适了。

160

要找到所有的文件名,可以使用 os.listdir() 这个函数。

接着,你可以对这些文件名进行循环处理。像这样:

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

如果你更喜欢使用 subprocess,那就用 subprocess 吧。:-)

撰写回答