2013-08-21 2 views
0

У меня есть файл, который может содержать другой файл. Мне нужно открыть файл include и определить расширение файла для определенного файла (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 

Я написал следующий код, но он выглядит, как я делаю некоторые ошибка. Поэтому сначала я проверил, что я отформатировал if в первый файл и нашел, что return. Если у меня нет, то я заглядываю в файл, который включен, и попробуйте изучить второй файл. Нам нужно рекурсивный поиск до двух раз. Вторая версия кода

Я изменил код еще раз и в состоянии определить расширение файла на первого уровня Но второго уровня я не в состоянии определить расширение файла , который не вернуть мне None. комментарий Обзора также приветствует, если я могу улучшить мой код

#!/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 циклов
  • оператор возврата будет разорвать петлю всякий раз, когда линь е начинается с .include, поэтому он не будет охватывать файлы с несколькими включает

Я надеюсь, что это может помочь.

#!/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

После моего анализа я исправил эту проблему в поиске первого уровня и второго уровня с использованием ниже кода. Это будет отличная помощь, если кто-либо предоставит код commnet/optimization в нижнем коде.

#!/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

Смежные вопросы