Python 文件中文件扩展名的递归搜索
我有一个可以包含另一个文件的文件。我需要打开include文件并确定特定文件(demo.spx)的文件扩展名。例如: 文件名:sample.txtPython 文件中文件扩展名的递归搜索,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
* 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格式化到第一个文件中,并找到了返回值。若并没有,我会查看包含的文件,并尝试查看第二个文件。我们需要递归搜索最多两次。
第二版代码
我再次修改了代码,并能够确定上的文件扩展名
第一级但第二级我无法确定文件扩展名
我一个也不回。如果我能改进我的工作,也欢迎评论
代码
我试图根据以下考虑重构您的工作:
- 我使用了open和close来读取文件:它增加了一行,但限制了圈复杂度(这有助于理解它)
- 我删除了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))