[英]Python3.8 - How To get total combinations which can be made with min length and max length
[英]Get min, max, and total length of wav files
我有一个包含数百个wav
文件的文件夹。 我想分别以最短的wav文件和最大的长度来获取最小长度(以毫秒为单位)。 我也想获取所有文件的总长度。
我知道我可以使用sox
和sed
来获取单个wav文件的长度,像这样
sox some_file.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p'
我想到的最简单的方法是使用Python
脚本循环遍历我的所有文件,因为它们都具有通用的连续文件名({001-800} .wav),并调用上面的代码。 但是,我不确定该怎么做。 我知道subprocess
应该是要使用的模块,但是我不知道如何使用管道。
目前,我在这方面坚持下去:
import subprocess
import shlex
min = 1000
max = 0
total = 0
for i in range(1,801):
cmd = "sox %03d.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p" % i
subprocess.call(shlex.split(cmd))
# here is where I would catch the output and do the calculations with min, max, and total
您的示例中的cmd
是Shell管道。 subprocess.call()
默认情况下不会调用外壳程序,即,除非指定shell=True
(在这种情况下使用字符串参数),否则您的命令应该会失败。 要获取输出,可以调用:
output = subprocess.check_output(cmd, shell=True)
您可以避免调用Shell命令,而使用“ 如何获取.avi文件长度”问题中演示的纯Python解析器:
#!/usr/bin/env python
from glob import glob
from hachoir_metadata import extractMetadata
from hachoir_parser import createParser
entries = [(path, extractMetadata(createParser(path)).get('duration'))
for path in glob(u"*.wav")]
print "Min: path(%s), duration(%s)" % min(entries, key=lambda (_,d): d)
print "Max: path(%s), duration(%s)" % max(entries, key=lambda (_,d): d)
print "Total: duration(%s seconds)" % sum(d.total_seconds() for _, d in entries)
要安装hachoir库 ,请运行:
$ pip install hachoir-{core,parser,metadata}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.