开源软件SOX是一个命令行界面工具,可以处理音频文件。它具有stat函数,该函数返回与音频文件有关的数据。该数据以字符串形式返回-很难使用的字符串。
下面是由SOX返回的字符串的示例。
\ n输入文件:'E:\ path \ to \ file \ filename.wav'\ n通道:1 \ n采样率:176400 \ n精度:16位\ n持续时间:00:00:30.00 = 5292001个样本〜2250个CDDA扇区\ nFile大小:10.6M \ n比特率:2.82M \ n示例编码:16位带符号整数PCM \ n“
和...
读取的样本:5292001 \ n长度(秒):30.000006 \ n缩放比例:2147483647.0 \ n最大振幅:0.705475 \ n最小振幅:-0.705475 \ n中线振幅:0.000000 \ n平均模数:0.449045 \ n平均振幅:0.000153 \ nRMS振幅:0.498788 \ n最大增量:1.410950 \ n最小变化量:0.000000 \ n平均变化量:0.571030 \ nRMS变化量:0.704606 \ n粗糙频率:39659 \ n音量调整:1.417 \ n \ n尝试:-t raw -e mu-law -b 8'
一个值可能具有的字符数可以从一个文件更改为另一个文件,并且某些文件实际上将完全丢失某些值。
如何从这些字符串中获取简单的值字典?
解决方案
您可以split打开'\n',然后dict通过拆分将对提供给构造函数':':
给定第二个示例字符串:
>>> s = """Samples read: 5292001\nLength (seconds): 30.000006\nScaled by: 2147483647.0\nMaximum amplitude: 0.705475\nMinimum amplitude: -0.705475\nMidline amplitude: 0.000000\nMean norm: 0.449045\nMean amplitude: 0.000153\nRMS amplitude: 0.498788\nMaximum delta: 1.410950\nMinimum delta: 0.000000\nMean delta: 0.571030\nRMS delta: 0.704606\nRough frequency: 39659\nVolume adjustment: 1.417\n\nTry: -t raw -e mu-law -b 8 '"""
可以通过以下方式创建字典:
>>> dict(r.strip().split(':', 1) for r in s.split('\n') if r)
其中,if r负责过滤掉空行和1在分裂负责执行只在一组(这样的字符串一样Duration有很多":"不会得到分头多次)。
这样产生:
{'Length (seconds)': ' 30.000006',
'Maximum amplitude': ' 0.705475',
'Maximum delta': ' 1.410950',
'Mean amplitude': ' 0.000153',
'Mean delta': ' 0.571030',
'Mean norm': ' 0.449045',
'Midline amplitude': ' 0.000000',
'Minimum amplitude': ' -0.705475',
'Minimum delta': ' 0.000000',
'RMS amplitude': ' 0.498788',
'RMS delta': ' 0.704606',
'Rough frequency': ' 39659',
'Samples read': ' 5292001',
'Scaled by': ' 2147483647.0',
'Try': " -t raw -e mu-law -b 8 '",
'Volume adjustment': ' 1.417'}
同样,对于第一个示例字符串:
>>> s = """\nInput File : 'E:\\path\\to\\file\\filename.wav'\nChannels : 1\nSample Rate : 176400\nPrecision : 16-bit\nDuration : 00:00:30.00 = 5292001 samples ~ 2250 CDDA sectors\nFile Size : 10.6M\nBit Rate : 2.82M\nSample Encoding: 16-bit Signed Integer PCM\n"""
>>> dict(r.strip().split(':', 1) for r in s.strip().split('\n') if r)
{'Bit Rate ': ' 2.82M',
'Channels ': ' 1',
'Duration ': ' 00:00:30.00 = 5292001 samples ~ 2250 CDDA sectors',
'File Size ': ' 10.6M',
'Input File ': " 'E:\\path\\to\\file\\filename.wav'",
'Precision ': ' 16-bit',
'Sample Encoding': ' 16-bit Signed Integer PCM',
'Sample Rate ': ' 176400'}