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

问题描述 投票:0回答:2

SyntaxError:太多的静态嵌套块

我正在尝试将xml文件解析为csv文件。但是当for...in...条件嵌套20次以上时,出现此SyntaxError错误。

如何减少行数以避免此SyntaxError?

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)
python python-3.x csv block
2个回答
0
投票

无论您想做什么,都做得不好。如前所述,随着每个循环的缩进越来越远,这将为[[every B附加all A(因此,如果有5个A条目和3个B条目,您将拥有A1, B1, B2, B3, A2, B1, B2, B3, A3, B1, B2, B3, A4, B1, B2, B3, A5, B1, B2, B3)。然后在每个条目之间的[[all C”,依此类推。如果每种类型的数量为偶数2,则您的list最终将超过一百万个元素;在每种类型的三个元素上,大约35亿个条目(足以耗尽大多数家用计算机上的RAM),在四个类型上,超过一万亿个条目(足以破坏大多数超级计算机)。

我能想象到的唯一明智的代码根本不会嵌套循环;只需将所有循环都缩进相同的缩进级别,理想情况下,使其成为一个双重嵌套的循环,一个遍历要查找的事物,一个遍历所发现的事物: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)

这样就可以一次获得每种类型的所有唯一元素,用更少的代码,也不会发生组合爆炸。

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

0
投票
def data(index, child_data=None): def generator(): for time in root.findall(index): yield time.text if child is not None: yield from child_data() return generator indices = "ABCDEFGHIJKLMNOPQRSTU".split("") for time in root.findall(indices[0]): time_data = data(indices[-1]) for index in indices[1:-1][::-1]: time_data = data(index, time_data) row = [time.text] + list(time_data()) csvwriter.writerow(row)
© www.soinside.com 2019 - 2024. All rights reserved.