从Python中的SOX字符串输出中获取字典中的可用数据

时间:2016-11-19 13:57:03

标签: python regex string python-3.x dictionary

开源软件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'

值可能具有的字符数可能会从一个文件更改为另一个文件,而某些文件实际上会完全错过某些值。

如何从这些字符串中获取一个简单的值字典?

1 个答案:

答案 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'}