

`cat xxx`のようなコマンドをpythonから実行して、結果を受け取りたいです。  
受け取る実行結果は、  

[code]

    1  aaa  3a
    2  bbb  32
    3  ccc  50
    4  ddd  41
    5  eee  15
    
[/code]

のような文字列を想定しています。  
この文字列の各行をスペースでフィールドに区切り、各フィールドに処理を加え出力したいです。

  * 1〜2フィールド目はそのまま出力
  * 3フィールド目（30など）は１６進表現の文字列と考えて数値に変換し、以下のビット演算を行なう 
    * ５ビット目(０か１)を3フィールド目に出力
    * ４ビット目(０か１)を4フィールド目に出力
    * ３～１ビット目を、１０進表現(０～７)で5フィールド目に出力

出力例:

[code]

    1  aaa  1  1  2
    2  bbb  1  0  2
    3  ccc  1  0  0
    4  ddd  0  0  1
    5  eee  1  0  5
    
[/code]

このように加工することはできますか？


CC BY-SA 3.0
2016-04-08T06:59:34.720
23839
2016-08-29T01:16:13.713
2016-04-08T16:34:22.603
3054
15090
question
python
pythonで外部のコマンドを実行し、その出力に処理を加える方法


こんな感じですか．このコードでは`print`してます．文字列として保持してのちのタスクに使うかもしれませんが．

[code]

    import subprocess
    
    contents = subprocess.check_output('cat xxx',shell=True)
    for l in contents.splitlines():
        e = l.split()
        number = int(e[2],base=16)
        print(e[0],e[1],number>>4&1,number>>3&1,number&0b111)
    
[/code]


CC BY-SA 3.0
2016-04-08T07:18:41.650
23840
2016-04-08T07:46:49.010
2016-04-08T07:46:49.010
14418
14418
23839
answer


どこまでが必須な前提なのか分かりませんが、以下のように考えることをお勧めします。

  * `cat xxx` をPythonから実行する -> Pythonでファイルxxxを開いて読み込む


CC BY-SA 3.0
2016-04-08T07:31:41.727
23842
2016-04-08T07:31:41.727
806
23839
answer


＠Takayuki SHIMIZUKAWA さんの言うとおり、ただ`cat`の機能なら、Pythonファイルで読み込むべきです。

しかし、`cat`以外のプログラム、特に`tail -F`のような、全部の出力すぐに出てこない場合、`iter`を使うと良いと思います。

[code]

    from subprocess import Popen, PIPE
    
    p = Popen(['cat', xxx], stdout=PIPE)
    
    for line in iter(p.stdout.readline, ''):
        process_content(line) # process_content の実装方法は @takoika さんの回答にご参考
    
[/code]


CC BY-SA 3.0
2016-08-28T08:37:02.077
28540
2016-08-29T01:16:13.713
2016-08-29T01:16:13.713
18621
18621
23839
answer