2013-08-21 117 views
0

我有一個文件可以包含另一個文件。我需要打開包含文件並確定特定文件的文件擴展名(demo.spx)。例如:遞歸搜索文件中的文件擴展名

文件名:sample.txt的

* SetUp Time Simulation 

***************************************************** 
*Options 
.options nomod 
*+ autostop=0 
*+ rmax=2 
*+ absv=1E-6 
*+ relv=1E-3 
*+ trtol=0.1 
*+ lvltim=3 
*+ dvdt=2 
*+ relvar=0.2 
*+ absvar=0.2 
*+ ft=0.2 
*+ relmos=0.01 
*+ method=TRAP 
*+ notop=0 
+ post=1 
+ runlvl=5 rmax=25 
+ ingold=2 
+ CO=132 
+ MEASFORM = 3 
.WIDTH OUT=132 


.include './test.sp' 

文件:test.sp

***************************************************** 

* Circuit definition 
.include **'demo.spx'** 

.param vdd=0.99 
.param vss=0 
.temp=-40C 

*Supplies 
.global VDD VSS VBP VBN 
Vdd VDD 0 vdd 
Vss VSS 0 vss 
Vbp VBP 0 vdd 
Vbn VBN 0 0 
Vsi SI 0 0 
Vse SE 0 0 

我寫了下面的代碼,但它看起來像我在做一些錯誤。所以首先我檢查了我已格式化,如果第一個文件,並發現返回。如果我沒有看到包含的文件並嘗試查看第二個文件。我們需要遞歸搜索兩次。 的代碼

我又修改代碼,並能夠確定 第一的水平,但第二級文件擴展名第二個版本,我無法確定文件擴展名 這回我沒有。審查意見也歡迎,如果我能提高我的 代碼

#!/usr/bin/env py 

import os 
import sys 
def parse_file_extension(gold_deck, found, count): 
    extention_list = [ "lvs", "cir", "spx"] 
    if(count == 2 or found == True): 
     return 
    with open(gold_deck, 'r+') as fspi: 
     while 1: 
      data = fspi.readline() 
      if not data: 
       break 
      if data.startswith('.include'): 
       data = data.split() 
       print data 
       netlist_file_extension = data[1].split(".")[-1].rstrip("'") 
       print netlist_file_extension 
       if netlist_file_extension in extention_list: 
        netlist_file = os.path.basename(data[1]).strip("'") 
        count = count + 1 
        found = True 
        print "First include" 
        print count 
        return netlist_file 
       else: 
        gold_deck = os.path.basename(data[1]).rstrip("'") 
        print gold_deck 
        parse_file_extension(gold_deck, found, count) 

def main(argv): 
    gold_deck = "sample.txt" 
    netlist_file = parse_file_extension(gold_deck, False, 0) 
    print netlist_file **//None Expecting demo.spx** 

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 

回答

1

我試圖根據這個考慮重構你的工作:

  • 我用開放接近讀取文件:它增加了一行但限制了圈複雜度(這有助於理解它)
  • 我刪除了找到了價值,這並沒有(在你的最終代碼至少)做任何事情
  • 我改名爲計數參數深度,並調用它,而不是內部功能

然後我之前加一有關於你的最後一個代碼解決方案几句話:

  • 它不檢查的深度,所以2個週期
  • return語句將打破循環每當行之後不會停止開頭。包括,所以它不會涵蓋多個包含文件

我希望這可以幫助。

#!/usr/bin/env py 

from os.path import splitext 
import sys 

def parse_file_extension(gold_deck, depth): 
    extention_list = [ "lvs", "cir", "spx"] 
    fspi = open(gold_deck, 'r+') 
    for data in fspi: 
     if data.startswith('.include'): 
      data = data.split() 
      netlist_file,netlist_file_extension = splitext(data[1].strip("'")) 
      if netlist_file_extension not in extention_list: 
       netlist_file = parse_file_extension(netlist_file, depth+1) 
      return netlist_file 
    fspi.close() 

def main(argv): 
    gold_deck = "sample.txt" 
    netlist_file = parse_file_extension(gold_deck, 0) 
    print netlist_file 

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 
0

更換

   return netlist_file 

   yield netlist_file 

所以你的函數返回迭代器。

files=[parse_file_extension(gold_deck, found, count)] 

將產生文件列表。

0

經過我的分析,我已經解決了這個問題到一級和二級搜索與下面的代碼implementation.It將是很好的幫助,如果有人在下面的代碼提供代碼commnet /優化。

#!/usr/bin/env py 

import os 
import sys 

def parse_file_extension(gold_deck, found, count): 
    extention_list = [ "lvs", "cir", "spx"] 
    with open(gold_deck, 'r+') as fspi: 
     while 1: 
      data = fspi.readline() 
      if not data: 
       break 
      if data.startswith('.include'): 
       data = data.split() 
       netlist_file_extension = data[1].split(".")[-1].strip("'") 
       count = count + 1 
       if netlist_file_extension in extention_list: 
        found = True 
        netlist_file = os.path.basename(data[1]).strip("'") 
        return netlist_file 
       else: 
        gold_deck = os.path.basename(data[1]).strip("'") 
        netlist_file = parse_file_extension(gold_deck, found, count) 
        return netlist_file 

def main(argv): 
    gold_deck = "sample.txt" 
    #gold_deck = "test.sp" 
    netlist_file = parse_file_extension(gold_deck, False, 0) 
    print netlist_file 

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 
+0

您應該使用此代碼更新您的原始問題或詢問另一個單獨的問題。一般來說,你不應該試圖通過「回答」你自己的問題來提出後續問題。 – martineau