2017-04-18 189 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 - 答案更新。 –