开源软件SOX是一个命令行界面工具,可以处理音频文件。它有一个stat函数,返回与音频文件相关的数据。这个数据以字符串形式返回 - 这个字符串非常容易使用。
SOX返回的字符串示例如下。
\ n输入文件:'E:\ path \ to \ file \ filename.wav'\ nChannels:1 \ nSample Rate:176400 \ n精度:16位\ nDuration:00:00:30.00 = 5292001 samples~2250 CDDA扇区\ n文件大小:10.6M \ n比特率:2.82M \ n采样编码:16位有符号整数PCM \ n“
和...
样品读数:5292001 \ nLength(秒):30.000006 \ n标准:2147483647.0 \ n最大幅度:0.705475 \ n最小幅度:-0.705475 \ n中线幅度:0.000000 \ n均衡:0.449045 \ n海洋幅度:0.000153 \ nRMS幅度:0.498788 \ n最大delta:1.410950 \ n最小delta:0.000000 \ nMean delta:0.571030 \ nRMS delta:0.704606 \ n频率:39659 \ n体积调整:1.417 \ n \ n尝试:-t raw -e mu-law -b 8'
值可能具有的字符数可能会从一个文件更改为另一个文件,而某些文件实际上会完全错过某些值。
如何从这些字符串中获取一个简单的值字典?
答案 0 :(得分:1)
您可以在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'}