Python 文件中文件扩展名的递归搜索

Python 文件中文件扩展名的递归搜索,python,recursion,Python,Recursion,我有一个可以包含另一个文件的文件。我需要打开include文件并确定特定文件(demo.spx)的文件扩展名。例如: 文件名:sample.txt * SetUp Time Simulation ***************************************************** *Options .options nomod *+ autostop=0 *+ rmax=2 *+ absv=1E-6 *+ relv=1E-3 *+ trtol=0.1 *+ l

我有一个可以包含另一个文件的文件。我需要打开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

我已经写了下面的代码,但看起来我犯了一些错误。所以,首先我检查了是否已将if格式化到第一个文件中,并找到了返回值。若并没有,我会查看包含的文件,并尝试查看第二个文件。我们需要递归搜索最多两次。 第二版代码

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


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

  • 我使用了openclose来读取文件:它增加了一行,但限制了圈复杂度(这有助于理解它)
  • 我删除了Found值,该值没有任何作用(至少在最终代码中)
  • 我将count参数重命名为depth,并在调用它之前增加它,而不是调用内部函数
然后,我对上一个代码解决方案有几点看法:

  • 它不检查深度,因此在2个循环后不会停止
  • 只要一行以.include开头,return语句就会中断循环,因此它不会覆盖包含多个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))
替换

                return netlist_file

因此,函数返回迭代器

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

将生成文件列表。

经过我的分析,我已通过下面的代码实现将此问题修复为一级和二级搜索。如果有人在下面的代码中提供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))

您应该使用此代码更新原始问题,或提出另一个单独的问题。一般来说,你不应该试图通过“回答”你自己的问题来问后续问题。
                yield netlist_file
  files=[parse_file_extension(gold_deck, found, count)]
#!/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))