come_on_haha 2023-10-22 11:53 采纳率: 33.3%
浏览 7
已结题

在运用filepath库时出现的问题

如图,我这个代码的错误都集中在这些filepath的应用上,如 return cls(itemre)说'filepath'unfilled,还有一些其他的问题不知道怎么改,希望能解释一下

from typing import Optional
from os import path
import re
from BoardSetting import BoardSetting
from NetSetting import NetSetting
BusList_org = []
BoundaryPoints_org = []
Components_org = []
PathList_org = []


term_regex = r'''(?mx) 
    \s*(?:
        (?P<roundl>\()|
        (?P<roundr>\))|
        (?P<num>[+-]?\d+\.\d+(?=[\ \]|\-?\d+(?=[\ \]]))|
        (?P<s>[^(^)\s]+)
        )'''


def parse_sexp(sexp):
    stack = []
    out = []
    for termtypes in re.finditer(term_regex,sexp):
        term,value = [(t,v) for t,v in termtypes.groupdict().items() if v][0]
        if term =='roundl':
            stack.append(out)
            out = []
        elif term == 'roundr':
            assert stack,"Trouble with nesting of brackets"
            tmpout, out = out,stack.pop(-1)
            out.append(tmpout)
        elif term == 'num':
            v = float(value)
            if v.is_integer():v = int(v)
            out.append(v)
        elif term == 's':
            out.append(value)
        else:
            raise NotImplementedError("Error: %r" % (term,value))
    assert not stack,"Trouble with nesting of brackets"
    return out[0]

class Board:
    def __init__(self,item,filePath:str,encoding: Optional[str] = None):
        self.filePath = filePath
        self.item = item
    @classmethod
    def from_sexpr(cls, exp: list,filePath:str):
        p1=0
        p2=0
        p3=0
        p4=0
        for i in range(len(exp)):
            p = exp[i]
            if p == "Bus":
                p1 = i
            elif p == "BoundaryPoints":
                p2 = i
            elif p == "Components":
                p3 = i
            elif p == "PathList":
                p4 = i
        for i in range(0, p1):
            BusList_org[i] = exp[i]
        for i in range(p1 + 1, p2):
            BoundaryPoints_org[i] = exp[i]
        for i in range(p2 + 1, p3):
            Components_org[i] = exp[i]
        for i in range(p3 + 1, p4):
            PathList_org[i] = exp[i]
        for i in range(len(BusList_org)):
            BusList_org.append(BusList_org[i])
        for i in range(len(BoundaryPoints_org)):
            BoundaryPoints_org.append(BoundaryPoints_org[i])
        for i in range(len(Components_org)):
            Components_org.append(Components_org[i])
        for i in range(len(PathList_org)):
            PathList_org.append(PathList_org[i])
        itemre = [0, 0, 0, 0]
        itemre[0] = BusList_org
        itemre[1] = BoundaryPoints_org
        itemre[2] = Components_org
        itemre[3] = PathList_org
        return cls(itemre)

    @classmethod
    def from_file(cls, filepath: str, encoding: Optional[str] = None) :
        if not path.isfile(filepath):
            raise Exception("Given path is not a file!")

        with open(filepath, 'r', encoding=encoding) as infile:
            # 把文件字符串分成S列表之后通过from_sexpr来导出各个数的值
            item = cls.from_sexpr(parse_sexp(infile.read()))
            item.filePath = filepath
            last = []
            last = cls.read_stack(item[1])
            return last
        #item是一个列表,每一个元素包含了一个栈,last是最后输出的栈

    @classmethod
    def read_stack(cls,stack):
        read=[]
        stack2 = []
        while stack:
            i=0
            read[i] = stack.pop()
            i+=1
            stack2.append(read[i])
        return cls(stack2)

#这是从filepath的s表达式中获取boundarypoint的代码:
filepath="E:\pythonstudy\check\mytext.txt"
a = Board.from_file(filepath)

def read_stack(stack):
    read = []
    while stack:
        i = 0
        read[i] = stack.pop()
        i += 1
    return read

BoundaryPoints = read_stack(a)
for i in range(len(BoundaryPoints)):
    print(BoundaryPoints[i])

  • 写回答

5条回答 默认 最新

  • 社区专家-Monster-XH 2023-10-22 11:53
    关注

    基于Monster 组和GPT的调写:

    图在哪?

    import re
    from typing import Optional
    from os import path
    
    # 由于没有BoardSetting和NetSetting的具体实现,这里我先注释掉这两行
    # from BoardSetting import BoardSetting
    # from NetSetting import NetSetting
    
    BusList_org = []
    BoundaryPoints_org = []
    Components_org = []
    PathList_org = []
    
    term_regex = r'''(?mx) 
        \s*(?:
            (?P<roundl>\()|
            (?P<roundr>\))|
            (?P<num>[+-]?\d+\.\d+(?=[\ \]|\-?\d+(?=[\ \]]))|
            (?P<s>[^(^)\s]+)
            )'''
    
    def parse_sexp(sexp):
        stack = []
        out = []
        for termtypes in re.finditer(term_regex, sexp):
            term, value = [(t, v) for t, v in termtypes.groupdict().items() if v][0]
            if term == 'roundl':
                stack.append(out)
                out = []
            elif term == 'roundr':
                assert stack, "Trouble with nesting of brackets"
                tmpout, out = out, stack.pop(-1)
                out.append(tmpout)
            elif term == 'num':
                v = float(value)
                if v.is_integer():
                    v = int(v)
                out.append(v)
            elif term == 's':
                out.append(value)
            else:
                raise NotImplementedError("Error: %r" % (term, value))
        assert not stack, "Trouble with nesting of brackets"
        return out[0]
    
    class Board:
        def __init__(self, item, filePath: str, encoding: Optional[str] = None):
            self.filePath = filePath
            self.item = item
    
        @classmethod
        def from_sexpr(cls, exp: list, filePath: str):
            itemre = [exp]  # 我假设exp是您想存储在itemre中的数据
            return cls(itemre, filePath)
    
        @classmethod
        def from_file(cls, filepath: str, encoding: Optional[str] = None):
            if not path.isfile(filepath):
                raise Exception("Given path is not a file!")
    
            with open(filepath, 'r', encoding=encoding) as infile:
                item = cls.from_sexpr(parse_sexp(infile.read()), filepath)
                return item  # 返回Board实例
    
        # 假设这个方法是为了读取存储在Board实例中的数据
        def read_stack(self):
            read = []
            # 由于不清楚self.item的结构,我在这里做一个基本的假设
            for item in self.item:
                read.append(item)
            return read
    
    # 使用文件路径
    filepath = r"E:\pythonstudy\check\mytext.txt"  # 注意这里使用的是原始字符串
    a = Board.from_file(filepath)
    
    # 获取数据
    BoundaryPoints = a.read_stack()  # 假设这是你想要的操作
    for point in BoundaryPoints:
        print(point)
    
    
    

    从你的代码来看,存在一些问题和可能的改进点。我将尽力为你解释和提供修改建议。

    1. 'filepath' unfilled: 这个错误可能是因为在某个地方尝试使用一个名为'filepath'的变量或参数,但没有为它提供值。但在你提供的代码中,我没有看到具体的错误消息或其上下文,所以我只能猜测这可能是问题所在。

    2. from_sexpr方法中,你试图在BusList_orgBoundaryPoints_orgComponents_orgPathList_org这些列表中使用索引来分配值,但这些列表在初始时是空的。使用索引来分配值于空列表会引发IndexError。使用append方法来添加元素是更合适的。

    3. from_sexpr方法中,你在循环结束后又对同一个列表使用了append,这实际上是在重复已有的数据,而不是存储新的数据。

    4. from_file类方法中,from_sexpr被调用时应该传入filePath,因为from_sexpr需要这个参数。此外,from_file方法中的item变量接收的是一个Board实例,因此你不能像处理列表那样处理它。

    5. read_stack方法似乎是想从栈中读取元素,但实现方式有些问题。你应该初始化i在循环外部,并在循环中递增它,而不是在每次循环时都将它重置为0。另外,stack2.append(read[i])应该在i递增之前调用。

    6. 最后,你的代码尝试从Board实例中读取BoundaryPoints,但read_stack函数看起来不适合这个目的。它似乎是想从一个栈结构中读取数据,但Board实例(a)并不是一个栈。

    7. 文件路径应使用双反斜杠(\\)或原始字符串(在字符串前加r,如r"E:\path\to\file"),因为在字符串中\是一个转义字符。

    在此代码中,我做了一些基本假设,并尝试修复一些潜在的错误。但是,要根据具体需求和缺失的类的实际逻辑(如 BoardSetting 和 NetSetting)来调整这个脚本。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月30日
  • 已采纳回答 10月22日
  • 创建了问题 10月22日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。