2017-04-18 61 views
0

我正在使用子進程來執行命令,然後嘗試解析其輸出。輸出的類型爲:使用Python解析命令行輸出並將結果存儲在字典中

物鏡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) 

似乎一切都工作正常除了字典創建。你能幫我找出問題嗎?

編輯:正如所建議的,我將字典創建移出循環,它似乎幫助我部分。我得到的當前輸出僅記錄每個鍵的一個值。我希望它會包含所有文件的值。 電流輸出看起來像:

( 'OBJ', '8')
( '/ JS', '2')
( '流', '1')
( 'endobj',' 8 ')

它應該是: (' OBJ」, '8', '6', '5',......)
...
...

+1

你的函數不返回任何東西。它應該返回字典。 – BHawk

回答

0

你繼續重新創建字典,但是你只使用final字典。您應該縮進最後兩行,或者將字典創建移出循環,具體取決於您希望在同一字典中是否包含所有內容,或者希望在所有文件中報告一次。

如您所說,如果您希望爲所有文件創建單個報表,則需要在循環前將字典創建(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

謝謝帕特里克。這似乎部分解決了我的問題。我根據你的建議和我得到的新輸出按問題進行了編輯。目前,每個密鑰只記錄一個值。 –

+0

@abhinavsingh - 答案更新。 –