2017-04-18 27 views
0

サブプロセスを使用してコマンドを実行し、その出力を解析しようとしています。出力は型である:コマンドライン出力の解析とPythonを使用した辞書への結果の格納

OBJ 6
endobj 6
ページ12
...
...

この出力は、ファイルの束全体に生成されます。 OBJ [

;:

結果は次のようなものでなければなりません6,8,3、....全ファイル用]
[endobj;すべてのファイル]
...
ための6,4,5、..... ...

は、私は、次のプログラムを作成するために管理:

import subprocess 
import os 
import re 
from collections import defaultdict 

def run_pdfid(filename, d): 
    try: 
     p = subprocess.Popen(['python', 
          '/Users/as/Desktop/tools/pdfid_v0_2_1/pdfid.py',filename],stdout=subprocess.PIPE) 

     for line in p.stdout: 
      if '%PDF' in line or line.startswith('PDFiD'): 
       continue 
      pattern1 = "^\s*(\S+)\s+(\d+)" 
      m = re.search(pattern1, line) 
      key = m.group(1) 
      if key in d: 
       d[key].append(m.group(2)) 
      else: 
       d[key] = m.group(2) 
    except Exception: 
     match = None 



if __name__ == '__main__': 
    os.chdir('/Users/as/Desktop/shared/clean') 
    d = dict() 
    for root, dirs, file_names in os.walk(os.getcwd()): 
     for file in file_names: 
      #print file 
      run_pdfid(file, d) 

    for key, value in d.iteritems(): 
     print (key, value) 

すべてが正常に動作しているようです辞書の作成は除きます。問題を見つけるのを助けてくれますか?

編集:示唆したように、私はループから辞書の作成を移動し、部分的に私を助けるようです。私が得ている現在の出力は、キーごとに1つの値しか記録していません。私はそれがすべてのファイルの値を含むことを望んでいました。

( 'OBJ'、 '8')
( '/ JS'、 '2')
( '流れ'、 '1')
( 'endobj'、 ': 電流出力は次のように見えます8 ')

それがされている必要があります: (' OBJ」、 '8'、 '6'、 '5'、.....)
...
...

+1

関数は何も返しません。それは辞書を返すべきです。 – BHawk

答えて

0

あなたは辞書を作り直していますが、あなたは最後の辞書。最後の2行をさらにインデントするか、すべてを同じ辞書に入れるか、すべてのファイルに対して一度だけレポートするかによって、ループから辞書の作成を移動する必要があります。

あなたが言うように、すべてのファイルについて1つのレポートが必要な場合は、ループの前にディクショナリの作成(d = dict())を上に移動する必要があります。

編集を追加する:あなたのコメントを再

を、あなたはおそらく一度キーを追加し、その後、あなたはそれに追加しようとすると、例外を打っています。あなたはd[key].append([m.group(2)])d[key].append(m.group(2))を変更することができ、本当にdefaultdictの全体の目的は、/ elseロジックならば、私は単純に置き換えるだろうと持っている必要がありますしないことです。

if key in d: 
    d[key].append(m.group(2)) 
else: 
    d[key] = m.group(2) 

で:

d[key].append(m.group(2)) 

defaultdictでは、キーがすでに存在するかどうかのチェックの理由はありません。

+0

ありがとうパトリック。これは私の問題を部分的に解決するようです。私はあなたの提案と私が得ている新しい出力に基づいて質問によって編集しました。現在、各キーには1つの値しか記録されていません。 –

+0

@abhinavsingh - 回答が更新されました。 –

関連する問題