错误的原因是,您滥用文件对象生成器的方式是,两次调用next的频率都比您想的要高.每次对next的调用都会得到一行并返回.因此,虽然’—‘不在next(file)中:fields1 = next(file).split(‘,’)获取一行,检查它是否为—,然后获取另一行并尝试对其进行解析.这意味着您可以跳过包含—的行,方法是在第二行中出现它.在这种情况下,您将找到文件的末尾,然后再找到要查找的行. StopIteration是迭代器通常如何指示其输入已用尽的方式.
您可能还需要在代码中解决几个其他问题:
>如果您已经在for循环中,则在文件之类的生成器上使用next可能会导致未定义的行为.这次您可能会摆脱它,但这通常不是一个好习惯.顺便说一句,您之所以无法使用它的主要原因是,您可能永远不会在触发while时真正将控制返回到for循环,而不是在这方面文件不是特别允许的.
>内部结构将您的数据转储到文件中,同时位于while循环内部.这意味着您使用“ w”权限打开的文件将在while的每次迭代(即文件中的每一行)都被截断.随着数组的增长,输出实际上会看起来很好,但是您可能希望将其移出内部循环.
最简单的解决方案是在两个循环中重写代码:一个循环找到您关心的零件的开始,另一个循环处理直到找到结束.
像这样:
test_arr = []
with open(fileName, 'r') as file:
for line in file:
if line.startswith('---') and 'section1' in line:
break
for line in file:
if '---' in line:
break
fields1 = line.split(',')
for item in fields1:
testarr.append({config.get('test','test'): item})
with open(test_dir,'w') as test_file:
json.dump(testarr, test_file)
编辑:
[email protected],[email protected]��为查找特定模式提供了极大的准确性和灵活性,但对于此示例而言,这确实是过高的.我想指出的是,如果您要查找除section1以外的其他部分,或者如果section1出现在其他一些带有破折号的行之后,则绝对需要这种两循环方法.其他答案中的单循环解决方案在非平凡的情况下将不起作用.