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

我已经编写了以下代码,但看起来我做错了。因此,首先我检查是否已将 if 格式化为第一个文件并找到该返回。如果我没有,我会查看包含的文件并尝试查看第二个文件。我们需要递归搜索最多两次。 第二版代码

我再次修改了代码并能够确定第一级的文件扩展名但第二级我无法确定返回无的文件扩展名。如果我可以改进我的代码,也欢迎评论评论

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

3 回答 3

1

我试图根据以下考虑重构您的工作:

  • 我使用打开关闭来读取文件:它增加了一行但限制了圈复杂度(这有助于理解它)
  • 我删除了Found值,它没有做任何事情(至少在你的最终代码中)
  • 我将count参数重命名为depth,并在调用它而不是内部函数之前递增它

然后,我对您的最后一个代码解决方案几乎没有评论:

  • 它不检查深度,因此不会在 2 个周期后停止
  • 每当一行以.include开头时,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))
于 2013-08-21T08:26:23.023 回答
0

代替

                return netlist_file

                yield netlist_file

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

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

将产生文件列表。

于 2013-08-21T08:28:00.377 回答
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))
于 2013-08-21T09:11:45.797 回答