2013-08-21 121 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