Python oggenc 脚本

3 投票
1 回答
517 浏览
提问于 2025-04-17 05:01

我想写一个Python脚本(没错,不是Bash),这个脚本会使用flac格式的音频文件,然后用oggenc进行编码,编码成功后再删除flac文件。

到目前为止,我有这个:

import os, sys
import fnmatch

command = 'oggenc -q7 *.flac'

def main():
    for root, dirs, files in os.walk('/home/wagnerf/test'):
        for name in files:
            if fnmatch.fnmatch(name, '*.flac'):

我本来想在if语句后面用

os.system("bash -c %s" % command)

但是这样不行,出现了

错误:没有指定输入文件。使用-h获取帮助。

我想我得在命令中使用文件名,对吧?

编辑一下
我的文件结构大概是这样的:

-- test
   -- test1
     -- test1.flac
     -- test2.flac
   -- test2
     -- test3.flac
     -- test1.flac

我希望这些flac文件能在同一个目录下转换成ogg格式,基本上我想自动化这个过程,

cd /somedir/
oggenc -q7 *.flac
cd ..
cd /someotherdir/
oggenc -q7 *.flac

这样我就不需要每次都进入子目录了!

回答:

@larsmanns 非常感谢,我只需要做一些调整:

from fnmatch import fnmatch
import os, sys
import subprocess

def main():
    for root, dirs, files in os.walk('/home/wagnerf/test'):
        flacs = [f for f in files if fnmatch(f, '*.flac')]
        if flacs:
            for file in flacs:
                cmd = 'oggenc', '-q7', '%s' % file
                subprocess.check_call(cmd, cwd=root)

flacs返回一个列表,我们需要对每个文件使用oggenc,所以对于每个元组都要这样做……

总之再次感谢,剩下的就简单了!

顺便说一下

我完成了这个脚本,你可以在这里找到它:musico

1 个回答

1

使用 subprocess 模块可以调用外部命令,这样你可以更详细地控制这些命令的执行:

from fnmatch import fnmatch
import os
import subprocess

def main():
    for root, dirs, files in os.walk('/home/wagnerf/test'):
        flacs = [f for f in files if fnmatch(f, '*.flac')]
        for f in flacs:
            cmd = ['oggenc', '-q7', f]
            subprocess.check_call(cmd, cwd=root)

这里的 cwd 参数可以让你在执行命令之前切换到指定的目录。文件名的匹配(也就是根据模式找文件)已经通过 fnmatch 完成,所以不需要中间再调用一个命令行。

你可以用 os.remove 来删除文件;不过我在这个例子里还没有加上这个部分。此外,上面的代码片段还没有经过测试。

撰写回答