2016-11-19 5 views
0

opensourceソフトウェアSOXは、オーディオファイルを処理するコマンドラインインターフェイスツールです。これは、オーディオファイルに関連するデータを返すstat関数を持っています。このデータは文字列として返されます。これはひどく使いやすい文字列ではありません。PythonでSOXの文字列出力から辞書に使用可能なデータを取得する

SOXから返される文字列の例を以下に示します。

\ n入力ファイル: 'E:\パス\から\ファイル\ファイル名.wav' \ nチャネル:1 \ nサンプルレート:176400 \ n精度:16ビット\ n時間:00:00:30.00 = 5292001サンプル〜2250 CDDAセクタはNFILEサイズを\:10.6M \ nビットレート:2.82M \ nSampleエンコーディング:16ビット符号付き整数PCM \ n」は

と...

サンプルが読み:5292001 \ NLENGTH(秒):30.000006 \ nScaled by: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頻度:3965 9 \ n音量調整:1.417 \ n \ nお試しください:-t raw -e mu-law -b 8 '

値が持つ可能性のある文字の数はファイルごとに変更でき、全部。

これらの文字列から簡単な値の辞書を取得するにはどうすればよいですか?

答えて

1

あなたは可能性があり'\n'split、その後':'に分割することによって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) 
あなたの第二のサンプル列が与えられ

ここで、は空白行を除外します。分割内の1の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'} 
+1

ワウ。完璧。どうもありがとう。 – user3535074

関連する問題