我正在尝试将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)
无论您想做什么,都做得不好。如前所述,随着每个循环的缩进越来越远,这将为[[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)
这样就可以一次获得每种类型的所有唯一元素,用更少的代码,也不会发生组合爆炸。
您收到的错误基本上是在告诉您:“没有合理的代码会做您正在做的事情,请重新考虑您的设计。”
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)