如何减少行以避免“静态嵌套块过多”?

2024-09-28 22:34:13 发布

您现在位置:Python中文网/ 问答频道 /正文

SyntaxError:静态嵌套块太多

我正在尝试将xml文件解析为csv文件。 但是当for...in...条件嵌套超过20次时,我得到了这个语法错误

如何减少行数以避免此语法错误

for time in root.findall('A'):
    #print(time.text)
    row=[]
    row.append(time.text)
    for time in root.findall('B'):
        #print(time.text)
        row.append(time.text)
        for time in root.findall('C'):
            row.append(time.text)
            for time in root.findall('D'):
                row.append(time.text)
                for time in root.findall('E'):
                    row.append(time.text)
                    for time in root.findall('F'):
                        row.append(time.text)
                        for time in root.findall('G'):
                            row.append(time.text)
                            for time in root.findall('H'):
                                row.append(time.text)
                                for time in root.findall('I'):
                                    row.append(time.text)
                                    for time in root.findall('J'):
                                        row.append(time.text)
                                        for time in root.findall('K'):
                                            row.append(time.text)
                                            for time in root.findall('L'):
                                                row.append(time.text)
                                                for time in root.findall('M'):
                                                    row.append(time.text)
                                                    for time in root.findall('N'):
                                                        row.append(time.text)
                                                        for time in root.findall('O'):
                                                            row.append(time.text)
                                                            for time in root.findall('P'):
                                                                row.append(time.text)
                                                                for time in root.findall('Q'):
                                                                    row.append(time.text)
                                                                    for time in root.findall('R'):
                                                                        row.append(time.text)
                                                                        for time in root.findall('S'):
                                                                            row.append(time.text)
                                                                            for time in root.findall('T'):
                                                                                row.append(time.text)
for time in root.findall('U'):
                                                                                row.append(time.text)
    csvwriter.writerow(row)

更新代码

head = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    row = []
    for headstr in head:
        for value in root.findall(headstr):
            row.append(value.text)

Tags: 文件textinfortimevalueroothead
1条回答
网友
1楼 · 发布于 2024-09-28 22:34:13

不管你想做什么,你都做得不对。如前所述,随着每个循环越来越深入地缩进,这将为每个A追加所有B(因此,如果有5个A条目和3个B条目,您就有了A1, B1, B2, B3, A2, B1, B2, B3, A3, B1, B2, B3, A4, B1, B2, B3, A5, B1, B2, B3)。然后是所有这些条目之间的C,依此类推。如果每种类型的计数都是2,那么在list中就会有超过一百万个元素;在每种类型的三个元素中,大约有35亿个条目(足以耗尽大多数家用计算机的内存),在四个元素中,超过一万亿个条目(足以破坏大多数超级计算机)

我能想象你想要的唯一理智的代码根本不会嵌套循环;只需将所有循环删除到相同的缩进级别,理想情况下,使其成为一个双嵌套循环,一个循环覆盖要查找的内容,一个循环覆盖找到的内容:

row = []
for tgt in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'):
    for time in root.findall(tgt):
        row.append(time.text)

它只需一次获得每种类型的所有唯一元素,代码少得多,而且没有组合爆炸

你得到的错误基本上是告诉你“没有合理的代码会做你正在做的事情,重新考虑你的设计。”

相关问题 更多 >