如何减少行数以避免 "too many statically nested blocks"?
How can I reduce the line to avoid the "too many statically nested blocks"?
语法错误:静态嵌套块过多
我正在尝试将 xml 文件解析为 csv 文件。
但是当 for...in...
条件嵌套超过 20 次时,我得到了这个 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)
更新代码
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)
无论你想做什么,你都没有做对。如所写,随着每个循环越来越缩进,这将附加 all B
s for every 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
s,依此类推。如果每种类型的数量甚至是 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)
这只获取每种类型的所有唯一元素一次,代码少得多,并且没有组合爆炸。
你得到的错误基本上是在告诉你 "No reasonable code would ever do what you're doing, rethink your design."
语法错误:静态嵌套块过多
我正在尝试将 xml 文件解析为 csv 文件。
但是当 for...in...
条件嵌套超过 20 次时,我得到了这个 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)
更新代码
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)
无论你想做什么,你都没有做对。如所写,随着每个循环越来越缩进,这将附加 all B
s for every 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
s,依此类推。如果每种类型的数量甚至是 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)
这只获取每种类型的所有唯一元素一次,代码少得多,并且没有组合爆炸。
你得到的错误基本上是在告诉你 "No reasonable code would ever do what you're doing, rethink your design."